EF Core 및 Xamarin 시작Getting Started with EF Core and Xamarin

이 자습서에서는 Entity Framework Core를 사용하는 SQLite 데이터베이스에 대한 데이터 액세스를 수행하는 Xamarin.Forms 애플리케이션을 만듭니다.In this tutorial, you create a Xamarin.Forms application that performs data access against a SQLite database using Entity Framework Core.

Windows 또는 Mac용 Visual Studio에서 Visual Studio를 사용하여 자습서의 설명에 따를 수 있습니다.You can follow the tutorial by using Visual Studio on Windows or Visual Studio for Mac.

GitHub에서 이 문서의 샘플을 볼 수 있습니다.You can view this article's sample on GitHub.

사전 요구 사항Prerequisites

다음 중 하나를 설치합니다.Install one of the below:

설명서에서는 자세한 단계별 설치 지침을 각 플랫폼에 대해 제공합니다.This documentation provides detailed step-by-step installation instructions for each platform.

샘플 프로젝트 다운로드 및 실행Download and run the sample project

이 애플리케이션 예제를 실행하고 탐색하려면 GitHub에서 코드를 다운로드합니다.To run and explore this sample application, download the code on GitHub.

다운로드한 후에는 Visual Studio 또는 Mac용 Visual Studio에서 솔루션 파일(EFGettingStarted.sln)을 열고 원하는 플랫폼에서 애플리케이션을 실행합니다.Once downloaded, open the solution file EFGettingStarted.sln in Visual Studio or Visual Studio for Mac and run the application on the platform of your choice.

처음 시작될 때 앱은 블로그를 나타내는 두 항목으로 로컬 SQLite 데이터베이스를 채웁니다.When the app first starts, it will populate the local SQLite database with two entries representing blogs.

모든 블로그 목록 페이지의 스크린샷

도구 모음에서 추가 단추를 클릭합니다.Click the Add button in the toolbar.

새 블로그에 대한 정보를 입력할 수 있는 새 페이지가 표시됩니다.A new page will appear that allows you to enter information about a new blog.

새 블로그 편집 페이지의 스크린샷

모든 정보를 입력하고 도구 모음에서 저장을 클릭합니다.Fill out all the info and click Save from the toolbar. 새 블로그는 앱의 SQLite 데이터베이스에 저장되고 목록에 표시됩니다.The new blog will save to the app's SQLite database and will show in the list.

목록에서 블로그 항목 중 하나를 클릭하여 해당 블로그의 게시물을 볼 수 있습니다.You can click on one of the blog entries in the list and see any posts for that blog.

블로그 게시물 목록 페이지의 스크린샷

도구 모음에서 추가를 클릭합니다.Click Add in the toolbar.

그러면 새 블로그 게시물에 대해 정보를 입력할 수 있는 페이지가 표시됩니다.A page then appears that allows you to fill out information about a new blog post.

새 게시물 추가 페이지의 스크린샷

모든 정보를 입력하고 도구 모음에서 저장을 클릭합니다.Fill out all the information and click Save in the toolbar.

새 게시물이 이전 단계에서 클릭한 블로그 게시물에 연결되고 앱의 SQLite 데이터베이스에 저장되어 목록에 표시됩니다.The new post will be associated to the blog post you clicked on in a previous step and will save to the app's SQLite database and show in the list.

블로그 목록 페이지로 돌아갑니다.Go back to the blog list page. 도구 모음에서 모두 삭제를 클릭합니다.And click Delete All in the toolbar. 그러면 모든 블로그 및 해당 게시물이 앱의 SQLite 데이터베이스에서 삭제됩니다.All blogs and their corresponding posts will then be deleted from the app's SQLite database.

모든 블로그가 삭제된 앱의 스크린샷

코드 탐색Explore the code

다음 섹션에서는 EF Core에서 Xamarin.Forms를 사용하여 SQLite 데이터베이스에서 데이터를 읽고, 만들고, 업데이트하고, 삭제하는 샘플 프로젝트의 코드를 안내합니다.The following sections will walk you through the code in the sample project that reads, creates, updates, and deletes data from a SQLite database using EF Core with Xamarin.Forms.

여기서는 데이터 표시페이지 간 탐색에 관한 Xamarin.Forms 항목에 대해 잘 알고 있는 것으로 가정하고 설명합니다.It is assumed that you are familiar with the Xamarin.Forms topics of displaying data and navigating between pages.

Entity Framework Core NuGet 패키지Entity Framework Core NuGet packages

EF Core를 사용하여 Xamarin.Forms 앱을 만들려면 대상으로 지정할 EF Core 데이터베이스 공급자용 패키지를 Xamarin.Forms 솔루션의 모든 프로젝트에 설치합니다.To create Xamarin.Forms apps with EF Core, you install the package for the EF Core database provider(s) you want to target into all of the projects in the Xamarin.Forms solution. 이 자습서에서는 SQLite 공급자를 사용합니다.This tutorial uses the SQLite provider.

다음 NuGet 패키지는 Xamarin.Forms 솔루션의 각 프로젝트에 필요합니다.The following NuGet package is needed in each of the projects in the Xamarin.Forms solution.

  • Microsoft.EntityFrameworkCore.Sqlite

모델 클래스Model classes

EF Core를 통해 액세스되는 SQLite 데이터베이스의 각 테이블은 클래스에서 모델링됩니다.Each table in the SQLite database accessed through EF Core is modeled in a class. 이 샘플에서는 Models 폴더에서 찾을 수 있는 두 개의 클래스, 즉 BlogPost를 사용합니다.In this sample, two classes are used: Blog and Post which can be found in the Models folder.

모델 클래스는 데이터베이스의 열을 모델링하는 속성으로만 구성됩니다.The model classes are composed only of properties, which model columns in the database.

  • Blog.csBlog.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>();
        }
    }
    
  • Posts 속성은 BlogPost 간에 부모-자식 관계를 정의합니다.The Posts property defines a parent-child relationship between Blog and Post.

  • Post.csPost.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; }
        }
    }
    
  • BlogIdBlog 속성은 Post 인스턴스에 대한 부모 Blog 개체와 다시 연결됩니다.The BlogId and Blog properties relate back to the parent Blog object for the instance of the Post.

데이터 컨텍스트Data context

BloggingContext 클래스는 Services 폴더에 있으며 EF Core DbContext 클래스에서 상속됩니다.The BloggingContext class is located in the Services folder and inherits from the EF Core DbContext class. DbContext는 데이터베이스 쿼리 및 변경 내용을 함께 그룹화하는 데 사용됩니다.A DbContext is used to group together database queries and changes.

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}");
        }
    }
}
  • DbSet 형식의 이 클래스의 두 속성은 모두 블로그 및 게시물을 나타내는 기본 테이블에 대해 작동하는 데 사용됩니다.Both properties in this class of type DbSet are used to operate on the underlying tables representing Blogs and Posts.
  • iOS에서 SQLite를 시작하려면 생성자에 SQLitePCL.Batteries_V2.Init()가 필요합니다.The SQLitePCL.Batteries_V2.Init() is needed in the constructor to initiate SQLite on iOS.
  • OnConfiguring 함수는 물리적 디바이스에서 SQLite 데이터베이스의 위치를 설정합니다.The OnConfiguring function sets up the location of the SQLite database on the physical device.

만들기, 읽기, 업데이트 및 삭제Create, read, update & delete

다음은 EF Core가 SQLite에 액세스하는 데 사용되는 앱의 일부 인스턴스입니다.The following are some instances in the app where EF Core is used to access SQLite.

ReadRead

  • 모든 레코드를 반환합니다.Return all records.
    • BlogsPage.xaml.csOnAppearing 함수는 모든 Blog 레코드를 반환하고 List 변수에 저장합니다.The OnAppearing function of BlogsPage.xaml.cs returns all Blog records and stores them into a List variable.
using (var blogContext = new BloggingContext())
{
    var theBlogs = blogContext.Blogs.ToList();
}
  • 특정 레코드를 반환합니다.Return specific records.
    • PostsPage.xaml.csOnAppearing 함수는 특정 BlogId가 포함된 Post 레코드를 반환합니다.The OnAppearing function of PostsPage.xaml.cs returns Post records that contain a specific BlogId.
using (var blogContext = new BloggingContext())
{
    var postList = blogContext.Posts
        .Where(p => p.BlogId == BlogId)
        .ToList();
}

만들기Create

  • 새 레코드를 삽입합니다.Insert a new record.
    • AddBlogPage.xaml.csSave_Clicked 함수는 SQLite 데이터베이스에 새 Blog 개체를 삽입합니다.The Save_Clicked function of AddBlogPage.xaml.cs inserts a new Blog object into the SQLite database.
var blog = new Blog { Url = blogUrl.Text };

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

    await blogContext.SaveChangesAsync();
}

업데이트Update

  • 기존 레코드를 업데이트합니다.Update an existing record.
    • AddPostPage.xaml.csSave_Clicked 함수는 새 Post로 기존 Blog 개체를 업데이트합니다.The Save_Clicked function of AddPostPage.xaml.cs updates an existing Blog object with a new 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();
}

삭제Delete

  • 모든 레코드를 자식 레코드로 계단식 삭제합니다.Delete all records with cascade to child records.
    • BlogsPage.xaml.csDeleteAll_Clicked 함수는 SQLite 데이터베이스의 모든 Blog 레코드를 삭제하고 이 삭제를 모든 Blog 자식 Post 레코드에 계단식 적용합니다.The DeleteAll_Clicked function of BlogsPage.xaml.cs deletes all the Blog records in the SQLite database and cascades the deletes to all of the Blog child Post records.
using (var blogContext = new BloggingContext())
{
    blogContext.RemoveRange(blogContext.Blogs);

    await blogContext.SaveChangesAsync();
}

다음 단계Next steps

이 시작에서는 Xamarin.Forms 애플리케이션을 사용하여 Entity Framework Core를 사용하는 SQLite 데이터베이스에 액세스하는 방법을 알아봤습니다.In this getting started you have learned how to use a Xamarin.Forms application to access a SQLite database using Entity Framework Core.

Xamarin 개발자에게 유용한 다른 Entity Framework Core 항목은 다음과 같습니다.Other Entity Framework Core topics of interest to Xamarin developers: