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

Posted adoni

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.时间戳和行版本
1606283770
public byte[] Timestamp { get; set; }   //每次插入或更新行时,数据库生成一个时间戳,该属性也被视为并发标记

 

以上是关于4.EF Core 数据库映射模型基本配置的主要内容,如果未能解决你的问题,请参考以下文章

添加新实体标量时实体框架 4 映射片段错误

ASP.NET Core实现对象自动映射-AgileMapper

iCloud、Core Data、迁移和模型映射

ASP.NET Core实现对象自动映射-AgileMapper

Core Data 错误地选择了映射模型

如何有条件地将多个模型映射到 ASP.NET Core Identity 中的一个表(AspNetUsers)?