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 数据库映射模型基本配置的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core实现对象自动映射-AgileMapper