iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 22
0

前言

與過去Entity Framework 6相比,
Entity Framework Core(簡稱EF Core)在使用上做了相當的改變,
本文將介紹EF Core的使用方式。

同步發表於個人點部落 - [鐵人賽Day22] ASP.Net Core MVC 進化之路 - Entity Framework Core / Code first

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來建立。

DbContextEF 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; }
}

接著先來建立PersonEducation類別。
Person.cs

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

    [Required]
    [StringLength(20)]
    public string Name { get; set; }
        
    public int? Age { 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>();

接著在Startup中ConfigureServices方法加入連接字串設定。

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/


上一篇
[鐵人賽Day21] - Exception Filter & Middleware
下一篇
[鐵人賽Day23] - Entity Framework Core / Code First From Database
系列文
菜鳥練等區-ASP.Net Core MVC進化之路30

尚未有邦友留言

立即登入留言