Začínáme s EF Core a Xamarinem

V tomto kurzu vytvoříte aplikaci Xamarin.Forms , která provádí přístup k datům v databázi SQLite pomocí Entity Framework Core.

Kurz můžete sledovat pomocí sady Visual Studio ve Windows nebo Visual Studio pro Mac.

Tip

Ukázku pro tento článek najdete na GitHubu.

Požadavky

Nainstalujte jednu z následujících možností:

Tato dokumentace obsahuje podrobné pokyny k instalaci jednotlivých platforem.

Stažení a spuštění ukázkového projektu

Pokud chcete tuto ukázkovou aplikaci spustit a prozkoumat, stáhněte si kód na GitHubu.

Po stažení otevřete soubor EFGettingStarted.sln řešení v sadě Visual Studio nebo Visual Studio pro Mac a spusťte aplikaci na libovolné platformě.

Při prvním spuštění aplikace se naplní místní databáze SQLite dvěma položkami představujícími blogy.

Screenshot of all blogs list page

Klikněte na tlačítko Přidat na panelu nástrojů.

Zobrazí se nová stránka, která umožňuje zadat informace o novém blogu.

Screenshot of new blog edit page

Vyplňte všechny informace a klikněte na Uložit z panelu nástrojů. Nový blog se uloží do databáze SQLite aplikace a zobrazí se v seznamu.

Můžete kliknout na jeden z položek blogu v seznamu a zobrazit všechny příspěvky pro tento blog.

Screenshot of blog posts list page

Na panelu nástrojů klikněte na Přidat .

Zobrazí se stránka, která vám umožní vyplnit informace o novém blogovém příspěvku.

Screenshot of add new post page

Vyplňte všechny informace a klikněte na Uložit na panelu nástrojů.

Nový příspěvek bude přidružený k blogovém příspěvku, na který jste klikli v předchozím kroku, a uloží se do databáze SQLite aplikace a zobrazí se v seznamu.

Vraťte se na stránku se seznamem blogů. A na panelu nástrojů klikněte na Odstranit vše . Všechny blogy a jejich odpovídající příspěvky se pak odstraní z databáze SQLite aplikace.

Screenshot of app with all blogs deleted

Prozkoumání kódu

Následující části vás provedou kódem v ukázkovém projektu, který čte, vytváří, aktualizuje a odstraňuje data z databáze SQLite pomocí EF Core s Xamarin.Forms.

Předpokládá se, že jste obeznámeni s tématy Xamarin.Forms zobrazení dat a procházením mezi stránkami.

Důležité

Entity Framework Core používá reflexi k vyvolání funkcí, které může linker Xamarin.iOS v konfiguracích režimu vydání vypustit. Tomu se můžete vyhnout jedním ze dvou způsobů.

  • Prvním je přidat --linkskip System.Core do argumentů Další mtouch v možnostech sestavení iOS.
  • Případně můžete v možnostech sestavení iOS nastavit chováníDon't Link linkeru Xamarin.iOS. Tento článek vysvětluje další informace o linkeru Xamarin.iOS, včetně toho, jak nastavit chování v Xamarin.iOS. (Tento přístup není ideální, protože může vést k odmítnutí ze storu).

Balíčky NuGet Entity Framework Core

Pokud chcete vytvářet aplikace Xamarin.Forms pomocí EF Core, nainstalujte balíček pro poskytovatele databází EF Core, na které chcete cílit, do všech projektů v řešení Xamarin.Forms. Tento kurz používá zprostředkovatele SQLite.

V každém z projektů v řešení Xamarin.Forms je potřeba následující balíček NuGet.

  • Microsoft.EntityFrameworkCore.Sqlite

Třídy modelů

Každá tabulka v databázi SQLite, ke které se přistupuje prostřednictvím EF Core, je modelována ve třídě. V této ukázce se používají dvě třídy: Blog a Post které lze najít ve Models složce.

Třídy modelu se skládají pouze z vlastností, které sloupce modelu v databázi.

  • 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>();
        }
    }
    
  • Vlastnost Posts definuje vztah nadřazený-podřízený mezi Blog a Post.

  • 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; }
        }
    }
    
  • Blog Vlastnosti BlogId se vztahují zpět k nadřazeného Blog objektu pro instanci objektu Post.

Kontext dat

Třída BloggingContext se nachází ve Services složce a dědí z třídy EF Core DbContext . A DbContext slouží k seskupení databázových dotazů a změn.

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}");
        }
    }
}
  • Obě vlastnosti v této třídě typu DbSet slouží k práci s podkladovými tabulkami představujícími blogy a příspěvky.
  • V SQLitePCL.Batteries_V2.Init() konstruktoru je potřeba k inicializaci SQLite v iOSu.
  • Funkce OnConfiguring nastaví umístění databáze SQLite na fyzickém zařízení.

Vytvoření, čtení, aktualizace a odstranění

Následuje několik instancí v aplikaci, kde se ef Core používá pro přístup k SQLite.

Přečíst

  • Vrátí všechny záznamy.
    • Funkce OnAppearingBlogsPage.xaml.cs vrátí všechny Blog záznamy a uloží je do List proměnné.
using (var blogContext = new BloggingContext())
{
    var theBlogs = blogContext.Blogs.ToList();
}
  • Vrátí konkrétní záznamy.
    • Funkce OnAppearingPostsPage.xaml.cs vrátí Post záznamy, které obsahují určitý BlogId.
using (var blogContext = new BloggingContext())
{
    var postList = blogContext.Posts
        .Where(p => p.BlogId == BlogId)
        .ToList();
}

Vytvoření

  • Vložení nového záznamu
    • Funkce Save_ClickedAddBlogPage.xaml.cs vloží nový Blog objekt do databáze SQLite.
var blog = new Blog { Url = blogUrl.Text };

using (var blogContext = new BloggingContext())
{
    blogContext.Add(blog);

    await blogContext.SaveChangesAsync();
}

Aktualizovat

  • Aktualizujte existující záznam.
    • Funkce Save_Clicked aktualizace existujícího AddPostPage.xaml.csBlog objektu novým Post.
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();
}

Odstranění

  • Odstraňte všechny záznamy s kaskádovou na podřízené záznamy.
    • Funkce DeleteAll_ClickedBlogsPage.xaml.cs odstraní všechny Blog záznamy v databázi SQLite a kaskádově odstraní všechny Blog podřízené Post záznamy.
using (var blogContext = new BloggingContext())
{
    blogContext.RemoveRange(blogContext.Blogs);

    await blogContext.SaveChangesAsync();
}

Další kroky

V tomto úvodním článku jste zjistili, jak pomocí aplikace Xamarin.Forms přistupovat k databázi SQLite pomocí Entity Framework Core.

Další témata entity Framework Core, která jsou pro vývojáře Xamarinu zajímavá: