.NET Core + EF Core Code First

环境

  • SQL Server 2017
  • .NET Core 2.1
  • EF Core

参考

步骤

新建数据库上下文和模型

  1. 新建模型。在类内添加各种属性,对应数据库表中的列。
    • 以下全部使用Data Annotation方法 (另可使用Fluent API)需要引用[System.ComponentModel.DataAnnotations]
    • 设置主键:在属性前添加”[Key]
    • 设置非空:在属性前添加”[Required]
    • 设置自增:在属性前添加”[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      • DatabaseGeneratedOption 是枚举类型,包含【None(0), Identity(1), Computed(2)】三个映射。其中Identity代表自增,Computed代表计算生成值(使用Computed时EF不会更新数据库,但是会在更新数据库后返回数据库中本列的值,原文:“If you’re mapping your Code First classes to tables that contain computed columns, you don’t want Entity Framework to try to update those columns. But you do want EF to return those values from the database after you’ve inserted or updated data.”)
    • 自定义数据类型:在属性前添加”[Column(TypeName = “[Your Type]”)]
      • Column还可以指定列名(Name)和列顺序(Order)
    • 示例代码
      using System.ComponentModel.DataAnnotations;
      using System.ComponentModel;
      using System.ComponentModel.DataAnnotations.Schema;
      
      namespace Enterprise.Models {
          public class userInfo {
      
              [Key]
              [Column(TypeName = "varchar(5)")]
              [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
              public string id { get; set; }
      
              [Required]
              [Column(TypeName = "varchar(21)")]
              public string name { get; set; }
          }
      }

       

  2. 新建数据库上下文。
    • 引用 [Microsoft.EntityFrameworkCore]
    • 上下文类继承于[DbContext]
    • 类的构造函数包含“DbContextOptions<EnterpriseDBContext> options”,同时继承父类DbContext的参数options
    • 在类内添加所有Model的属性
      • 使用DbSet<[Your Models]>类型
    • 可以重载OnModelCreating方法来自定义创建数据库的选项
    • 示例代码
      using Microsoft.EntityFrameworkCore;
      using Enterprise.Models;
      
      namespace Enterprise.EntityFramework {
          public class EnterpriseDBContext:DbContext {
      
              public EnterpriseDBContext(DbContextOptions<EnterpriseDBContext> options) : base(options) {
      
              }
      
              public DbSet<userInfo> userInfo { get; set; }
      
              public DbSet<staffInfo> staffInfo { get; set; }
      
      
              //protected override void OnModelCreating(ModelBuilder modelBuilder) {
      
              //}
      
          }
      }

设置配置文件

  1. 在工程中的appsettings.json中添加新项。
    {
      "ConnectionStrings": {
        "Default": "Data Source=.; Database=Enterprise; Integrated Security=True;"
      }, //Key值可以自定义, Value中的Data Source为数据库地址,Database为数据库名称,验证方式这里选择了Windows集成验证
      ... ...
    }

使用依赖注入注册数据库上下文

  1. 编辑Startup.cs文件。
    • 引用[Microsoft.EntityFrameworkCore]以及上下文(这里将所有上下文类放到了一个目录中)
    • ConfigureServices方法中添加代码
      services.AddDbContext<EnterpriseDBContext>(d => d.UseSqlServer(Configuration.GetConnectionString("Default")));
    • 示例代码
      using Enterprise.EntityFramework;
      using Microsoft.EntityFrameworkCore;
      
              public void ConfigureServices(IServiceCollection services) {
                  services.Configure<CookiePolicyOptions>(options => {
                      // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                      options.CheckConsentNeeded = context => true;
                      options.MinimumSameSitePolicy = SameSiteMode.None;
                  });
      
                  services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
      
                  services.AddDbContext<EnterpriseDBContext>(d => d.UseSqlServer(Configuration.GetConnectionString("Default")));
              }

生成数据库

  1. 在控制台输入指令。
    • VS中选择【工具-NuGet包管理器-程序包管理器控制台】
    • 输入指令
      Add-Migration InitialCreate
      Update-Database
    • 对于指令的解释原文
      • “The Add-Migration command scaffolds a migration to create the initial set of tables for the model.”
      • “The Update-Database command creates the database and applies the new migration to it.”