4.EF Core 数据库映射模型基本配置

一、Fluent API 方式

1、重写 OnModelCreating 使用 Fluent API 配置模型class MyContext : DbContext

 {   public DbSet<Blog> Blogs { get; set; }   protected override void OnModelCreating(ModelBuilder modelBuilder)   {
      modelBuilder.Entity<Blog>() .ToTable("blogs"); //设置映射的数据库表名
      modelBuilder.Entity<Blog>() .ToTable("blogs", schema: "blogging"); //表在数据库的架构中创建
      modelBuilder.HasDefaultSchema("blogging"); //在模型级别定义 Fluent API 的默认架构,不用每个表指定架构:

      modelBuilder.Ignore<BlogMetadata>(); //排除BlogMetadata实体模型的数据库映射
      modelBuilder.Entity<Car>().HasKey(c => c.LicensePlate); ////主键  按照约定,将名为 Id 或 <type name>Id 的属性配置为实体的主键,如  Id 或 TruckId;类型为 short、int、long、或 Guid 的非复合主键会被设置在添加时生成值。 所有其他属性会被设置为不生成值。
      modelBuilder.Entity<Car>().HasKey(c => new { c.State, c.LicensePlate }); //设置复合主键

       modelBuilder.Entity<Blog>().Property(b => b.BlogId).ValueGeneratedNever(); //不生成值        modelBuilder.Entity<Blog>().Property(b =>b.Inserted).ValueGeneratedOnAdd();  //添加时生成值         modelBuilder.Entity<Blog>().Property(b =>b.LastUpdated).ValueGeneratedOnAddOrUpdate(); //添加或更新时生成值

      modelBuilder.Entity<Blog>()       .Property(b => b.Url)
       .HasColumnName("blog_id") //设置对应数据表字段的列名
       .HasColumnType("varchar(200)") //设置数据表字段的类型
       .HasMaxLength(500) //最大长度 适用string 和 byte[]       .IsRequired() // 必填

//并发出现脏数据处理,有两种方式,出现脏数据后都会抛出异常,需要自己处理

        //1.添加乐观锁                 modelBuilder.Entity<Person>().Property(p => p.LastName).IsConcurrencyToken(); //标记乐观锁,防止脏数据,如果出现并发,会抛出异常              //2.时间戳和行版本,每次插入或更新行时,数据库生成一个时间戳,该属性也被视为并发标记,需要在模型中定义 public byte[] Timestamp { get; set; } 字段         modelBuilder.Entity<Blog>().Property(p => p.Timestamp).IsRowVersion();

   } }

 

 2、新建模型配置类

a.继承IEntityTypeConfiguration接口

 public class BlogConfig : IEntityTypeConfiguration<Blog> { public void Configure(EntityTypeBuilder<Blog> builder) { builder.ToTable("Blog"); builder.Property(b => b.Remark).HasMaxLength(40); } }

b.重写 OnModelCreating添加配置类类型

class MyContext : DbContext {   public DbSet<Blog> Blogs { get; set; }   protected override void OnModelCreating(ModelBuilder modelBuilder)   {      base.OnModelCreating(modelBuilder);     modelBuilder.ApplyConfigurationsFromAssembly(Assembly.Load("配置类所在dll名"));   
  }
}

 

 

二、Data Annotations 数据注释方式

[Table("blogs")] //标注在类上,设置映射的表名[Table("blogs", Schema = "blogging")] //表在数据库的架构中创建[NotMapped] //标注在类上,不生成表的映射[NotMapped] //标注在类的属性上,排除此属性的数据库表字段[Key] //主键 按照约定,将名为 Id 或 <type name>Id 的属性配置为实体的主键,如 Id 或 TruckId;类型为 short、int、long、或 Guid 的非复合主键会被设置在添加时生成值。 所有其他属性会被设置为不生成值。复合主键,无法使用约定和 Data Annotations 设置复合键,只能使用 Fluent API 设置[Column("blog_id")] //设置对应数据表字段的列名[Column(TypeName = "varchar(200)")] //设置数据表字段的类型[MaxLength(500)] //最大长度 适用string 和 byte[][Required] //必填 [DatabaseGenerated(DatabaseGeneratedOption.None)] //不生成值public int BlogId { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Identity)] //在添加时生成值public DateTime Inserted { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] //在添加或更新时生成值,使用 Computed 无法赋值,只能通过计算获得。public DateTime LastUpdated { get; set; } 并发出现脏数据处理,有两种方式,出现脏数据后都会抛出异常,需要自己处理1.添加乐观锁[ConcurrencyCheck] //标记乐观锁,防止脏数据,如果出现并发,会抛出异常 2.时间戳和行版本[Timestamp]public byte[] Timestamp { get; set; } //每次插入或更新行时,数据库生成一个时间戳,该属性也被视为并发标记

 

相关文章