一、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; } //每次插入或更新行時,數據庫生成一個時間戳,該屬性也被視為並發標記