Erste Schritte mit EF Core und Xamarin
In diesem Tutorial erstellen Sie eine Xamarin.Forms-Anwendung, die den Datenzugriff auf eine SQLite-Datenbank mithilfe von Entity Framework Core durchführt.
Sie können dieses Tutorial mit Visual Studio unter Windows oder Visual Studio für Mac abschließen.
Tipp
Das in diesem Artikel verwendete Beispiel finden Sie auf GitHub.
Voraussetzungen
Installieren Sie eines der folgenden Tools:
- Visual Studio 2019 Version 16.3 oder höher mit dieser Workload:
- Mobile Entwicklung mit .NET
- Visual Studio für Mac
In dieser Dokumentation finden Sie ausführliche Installationsanweisungen für jede Plattform.
Herunterladen und Ausführen des Beispielprojekts
Laden Sie den Code von GitHub herunter, um diese Beispielanwendung auszuführen und zu untersuchen.
Sobald Sie sie heruntergeladen haben, öffnen Sie die Projektmappendatei EFGettingStarted.sln
in Visual Studio oder Visual Studio für Mac, und führen Sie die Anwendung auf der Plattform Ihrer Wahl aus.
Beim ersten Start der App wird die lokale SQLite-Datenbank mit zwei Einträgen aufgefüllt, die Blogs darstellen.
Klicken Sie in der Symbolleiste auf Hinzufügen.
Daraufhin wird eine neue Seite angezeigt, auf der Sie Informationen über einen neuen Blog eingeben können.
Geben Sie alle Informationen ein, und klicken Sie in der Symbolleiste auf Speichern. Der neue Blog wird in der SQLite-Datenbank der App gespeichert und in der Liste angezeigt.
Sie können auf einen der Blogeinträge in der Liste klicken, um alle Beiträge für diesen Blog anzuzeigen.
Klicken Sie auf der Symbolleiste auf Hinzufügen.
Dann wird eine Seite angezeigt, auf der Sie Informationen über einen neuen Blogbeitrag eingeben können.
Geben Sie alle Informationen ein, und klicken Sie in der Symbolleiste auf Speichern.
Der neue Beitrag wird dem Blogbeitrag zugeordnet, auf den Sie im vorherigen Schritt geklickt haben, und dann in der SQLite-Datenbank der App gespeichert und in der Liste angezeigt.
Wechseln Sie zurück zur Seite mit der Liste der Blogs. Klicken Sie dann auf der Symbolleiste auf Alle löschen. Daraufhin werden alle Blogs und ihre zugehörigen Beiträge aus der SQLite-Datenbank der App gelöscht.
Untersuchen des Codes
In den folgenden Abschnitten durchlaufen Sie den Code im Beispielprojekt, der Daten aus einer SQLite-Datenbank mithilfe von EF Core mit Xamarin.Forms liest, erstellt, aktualisiert und löscht.
Dabei wird davon ausgegangen, dass Sie mit den Xamarin.Forms-Themen zum Anzeigen von Daten und zum Navigieren zwischen Seiten vertraut sind.
Wichtig
Entity Framework Core verwendet Reflektion, um Funktionen aufzurufen, die der Xamarin.iOS-Linker in Release-Moduskonfigurationen möglicherweise entfernen könnte. Sie können eine von zwei Möglichkeiten auswählen, dies zu vermeiden.
- Die erste ist,
--linkskip System.Core
zu Weitere mtouch-Argumente in den iOS-Build-Optionen hinzuzufügen. - Alternativ können Sie das Xamarin.iOS-Linkerverhalten in den iOS-Build-Optionen auf
Don't Link
festlegen. Dieser Artikel enthält weitere Informationen zum Xamarin.iOS-Linker, unter anderem zum Festlegen des Verhaltens in Xamarin.iOS. (Dieser Ansatz ist nicht ideal, da er möglicherweise zu einer Ablehnung durch den Speicher führt).
NuGet-Pakete für Entity Framework Core
Zum Erstellen von Xamarin.Forms-Apps mit EF Core installieren Sie das Paket für den EF Core-Datenbankanbieter, den Sie als Ziel für alle Projekte in der Xamarin.Forms-Projektmappe verwenden möchten. In diesem Tutorial wird der SQLite-Anbieter verwendet.
Das folgende NuGet-Paket ist für alle Projekte in der Xamarin.Forms-Projektmappe erforderlich.
Microsoft.EntityFrameworkCore.Sqlite
Modellklassen
Alle Tabellen in der SQLite-Datenbank, auf die über EF Core zugegriffen wird, werden in einer Klasse modelliert. In diesem Beispiel werden zwei Klassen verwendet: Blog
und Post
, die sich im Ordner Models
befinden.
Die Modellklassen bestehen lediglich aus Eigenschaften, die Spalten in der Datenbank modellieren.
Blog.cs
using System; using System.Collections.Generic; namespace EFGetStarted { public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; set; } = new List<Post>(); } }
Die Eigenschaft
Posts
definiert eine Über-/Unterordnungsbeziehung zwischenBlog
undPost
.Post.cs
using System; namespace EFGetStarted { public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } } }
Die Eigenschaften
BlogId
undBlog
beziehen sich auf das übergeordneteBlog
-Objekt für diePost
-Instanz.
Datenkontext
Die BloggingContext
-Klasse befindet sich im Ordner Services
und erbt von der EF Core-Klasse DbContext
. Eine DbContext
-Klasse wird zum Gruppieren von Datenbankabfragen und -änderungen verwendet.
using System;
using System.IO;
using Microsoft.EntityFrameworkCore;
using Xamarin.Essentials;
namespace EFGetStarted
{
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public BloggingContext()
{
SQLitePCL.Batteries_V2.Init();
this.Database.EnsureCreated();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string dbPath = Path.Combine(FileSystem.AppDataDirectory, "blogs.db3");
optionsBuilder
.UseSqlite($"Filename={dbPath}");
}
}
}
- Beide Eigenschaften in dieser Klasse vom Typ
DbSet
werden verwendet, um die zugrunde liegenden Tabellen zu betreiben, die Blogs und Beiträge darstellen. SQLitePCL.Batteries_V2.Init()
ist im Konstruktor erforderlich, um SQLite unter iOS zu initiieren.- Die
OnConfiguring
-Funktion richtet den Speicherort der SQLite-Datenbank auf dem physischen Gerät ein.
Erstellen, Lesen, Aktualisieren und Löschen
Im Folgenden werden einige Instanzen in der App aufgeführt, in der EF Core für den Zugriff auf SQLite verwendet wird.
Lesen
- Zurückgeben aller Datensätze
- Die
OnAppearing
-Funktion vonBlogsPage.xaml.cs
gibt alleBlog
-Datensätze zurück und speichert diese in einerList
-Variable.
- Die
using (var blogContext = new BloggingContext())
{
var theBlogs = blogContext.Blogs.ToList();
}
- Zurückgeben spezifischer Datensätze
- Die
OnAppearing
-Funktion vonPostsPage.xaml.cs
gibtPost
-Datensätze zurück, die einen spezifischenBlogId
-Wert enthalten.
- Die
using (var blogContext = new BloggingContext())
{
var postList = blogContext.Posts
.Where(p => p.BlogId == BlogId)
.ToList();
}
Erstellen
- Einfügen eines neuen Datensatzes
- Die
Save_Clicked
-Funktion vonAddBlogPage.xaml.cs
fügt ein neuesBlog
-Objekt in die SQLite-Datenbank ein.
- Die
var blog = new Blog { Url = blogUrl.Text };
using (var blogContext = new BloggingContext())
{
blogContext.Add(blog);
await blogContext.SaveChangesAsync();
}
Aktualisieren
- Aktualisieren eines vorhandenen Datensatzes
- Die
Save_Clicked
-Funktion vonAddPostPage.xaml.cs
aktualisiert ein vorhandenesBlog
-Objekt mit einem neuenPost
.
- Die
var newPost = new Post
{
BlogId = BlogId,
Content = postCell.Text,
Title = titleCell.Text
};
using (var blogContext = new BloggingContext())
{
var blog = await blogContext
.Blogs
.FirstAsync(b => b.BlogId == BlogId);
blog.Posts.Add(newPost);
await blogContext.SaveChangesAsync();
}
Entf
- Löschen aller Datensätze mit einer Weitergabe an untergeordnete Datensätze
- Die
DeleteAll_Clicked
-Funktion vonBlogsPage.xaml.cs
löscht alleBlog
-Datensätze in der SQLite-Datenbank und gibt die Löschvorgänge an alle untergeordnetenPost
-Datensätze vonBlog
weiter.
- Die
using (var blogContext = new BloggingContext())
{
blogContext.RemoveRange(blogContext.Blogs);
await blogContext.SaveChangesAsync();
}
Nächste Schritte
In diesen ersten Schritten haben Sie gelernt, wie Sie eine Xamarin.Forms-Anwendung für den Zugriff auf eine SQLite-Datenbank mithilfe von Entity Framework Core verwenden.
Im Folgenden finden Sie weitere Entity Framework Core-Themen, die für Xamarin-Entwickler interessant sind:
- Konfigurieren einer
DbContext
-Klasse - Weitere Informationen zu LINQ-Abfrageausdrücken
- Konfigurieren Sie das Modell, um Aspekte wie required (erforderlich) und maximum length (maximale Länge) anzugeben.