十一月 6, 2018

[铁人赛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 来装载描述资料表的类别。

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/

本文永久链接:https://mrcpp.com/?p=96829,转载请注明出处

-- EOF --

相关文章 »