[鐵人賽Day22] ASP.Net Core MVC 進化之路 - Entity Framework Core / Code first

與過去Entity Framework 6相比,

Entity Framework Core(簡稱EF Core)在使用上做了相當的改變,

本文將介紹EF Core的使用方式。

 

ORM 

如果有接觸過EF6的讀者對ORM這個名詞應該都不陌生。

ORM是什麼呢?

ORM全名為Object Relationship Mapping(物件關聯對應),

主要可以幫助我們用「寫程式」的方式去描述資料庫的結構,

並幫我們實現資料庫的新刪修查的功能,

你可以將它想像成一個幫你跟資料庫溝通的代理人

好處是它可以幫我們將資料自動轉為強型別的物件。

 

而在.Net中實現ORM的工具有許多種,

Entity Framework系列是微軟官方推出的ORM工具,

它可以使用LINQ的描述方式幫助我們操作資料。

但假如貴公司還是習慣使用純粹的SQL語法操作,

可以考慮使用Dapper這套工具。

 

Entity Framework Core

EF Core.Net中幫助我們與DB溝通的ORM工具,

跟前一代的EF6相比最大的差別是輕量化與跨平台。

在過去EF6的時候edmx速度相對較慢,

但也真的非常強大XD。

EF Core將過去的Model First拿掉了,

目前的建制方式剩下以下兩種:

  • Code First(純手工的)
  • Code First with Database(從DB來的Code First)

 

以下將示範使用Code First的建立方式。

首先先建立好一個ASP.Net Core MVC的範本專案,

接著使用Nuget安裝Microsoft.EntityFrameworkCore 。

 

下面這兩張表描述著Person(人)與Education(學歷)的一對多關係,

我們使用Code First來建立。

 

DbContext 是EF Core中幫我們與資料庫溝通的類別,

所以我們先建立一個CustomDbContext 並繼承DbContext ,

並使用DbSet<TEntity> 來裝載描述資料表的類別。

public class CustomDbContext : DbContext
{
    public CustomDbContext(DbContextOptions<CustomDbContext> options) : base(options)
    {
    }

    public DbSet<Person> Person { get; set; }
    public DbSet<Education> Education { get; set; }
}

 

接著先來建立Person及Education類別。

Person.cs

public class Person
{
    [Required]
    public int Id { get; set; }

    [Required]
    [StringLength(20)]
    public string Name { get; set; }
        
    public int? Age { get; set; }
}

 

Education.cs

public class Education
{
    [Required]
    public int Id { get; set; }

    [StringLength(20)]
    public string SchoolName { get; set; }

    [Required]
    public int GraduatedYeay { get; set; }

    [Required]
    [ForeignKey("Person")]
    public int PersonId { get; set; }
        
    public virtual Person Person { get; set; }
}

 在資料欄位中凡命名包含ID者將會自動被視為主鍵,

你也可以透過 [Key] 自行設定。

 

[Required] 可設定必要的欄位(不允許Null),

但結構型別(int, double, float, datetime)不得為空值(只會是預設值),

所以使用 int? 方式設定。

 [StringLength()] 則代表字串長度。

 

好了之後在專案中建立一個dbsetting.json,

裡面會放置連接資料庫需用到的ConnectionStrings

{
  "ConnectionStrings": {
    "SampleDBConnection": "Server=(LocalDB)\\MSSQLLocalDB;Database=SampleDB;"
  }
}

 

接著修改Program中的組態設定,

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((webHostBuilder, configurationBinder) =>
        {
            configurationBinder.AddJsonFile("dbsetting.json", optional: true);
        })
        .UseStartup<Startup>();

 

接著在StartupConfigureServices方法加入連接字串設定。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<CustomDbContext>(options =>
    {
        options.UseSqlServer(Configuration.GetConnectionString("SampleDBConnection"));
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

 

最後在下面Configure方法中設定每次執行前檢查資料庫是否被建立。

public void Configure(IApplicationBuilder app, CustomDbContext customDbContext)
{
    customDbContext.Database.EnsureCreated();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

 

你也可以透過Add-Migration指令的方式進行建立,

有興趣的讀者可參考這篇

 

最後請將程式執行起來後,

使用資料庫連接工具(如SSMS)進行連接,

查看我們剛才建立的資料表。

Person

Education

 

Code First的內容就先介紹到這邊,

下篇會接著介紹EF CoreCode First From Database的使用方式

若內容有誤在麻煩指正。

 

參考

https://docs.microsoft.com/zh-tw/ef/core/