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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM