什麼是Fluent API?
官方答案:EF 中內嵌的約定將 POCO 類映射到表。但是,有時您無法或不想遵守這些約定,需要將實體映射到約定指示外的其他對象,所以Fluent API和注解都是一種方法,這兩種方法是用來配置EF,在映射屬性時繞開約定。詳情參考(https://msdn.microsoft.com/zh-cn/data/jj591617)
如何訪問Fluent API?
通過自定義類(繼承自DbContext )的OnModelCreating方法訪問。
屬性映射
主要配置:主鍵、數值長度、配置為必須、不映射,外鍵等
配置主鍵:
modelBuilder.Entity<ClassA>().HasKey(t => t.ID); //配置ClassA的ID屬性為主鍵
配置聯合主鍵:
modelBuilder.Entity<ClassA>().HasKey(t => new { t.ID, t.Name }); //配置ClassA的ID和Name為主鍵
設置數據非數據庫生成:
modelBuilder.Entity<ClassA>().Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); //ClassA的Id屬性不用數據庫控制生成
設置字段最大長度:
modelBuilder.Entity<ClassA>().Property(t => t.Name).HasMaxLength(100); //設置ClassA類的Name屬性的最大長度為100,如果值長度100,會拋出 DbEntityValidationException異常
設置字段為必需:
modelBuilder.Entity<ClassA>().Property(t =>t.Id).IsRequired(); //設置ClassA類的Id屬性為必需
屬性不映射到數據庫:
modelBuilder.Entity<ClassA>().Ignore(t => t.A); //調過ClassA類的A屬性,讓之不映射到數據庫中
將屬性映射到數據庫中特定列名:
modelBuilder.Entity<ClassA>() .Property(t => t.A) .HasColumnName("A_a"); //將類ClassA的屬性A映射到數據庫中對應列名A_a
類中不指定外鍵,但在數據庫中指定外鍵名:
modelBuilder.Entity<Staff>() .HasRequired(c => c.Department) .WithMany(t => t.Staffs) .Map(m => m.MapKey("DepartmentID")); //指定員工表中DepartmentID為Staff到Department的外鍵
指定屬性映射的字段為Unicode類型:
modelBuilder.Entity<ClassA>() .Property(t => t.Name) .IsUnicode(true);
設置屬性映射的列的類型:
modelBuilder.Entity<Department>() .Property(p => p.Name) .HasColumnType("varchar"); //設置列為varchar類型
設置復雜類型的屬性(何為復雜類型? 沒指定主鍵的類型):
modelBuilder.ComplexType<Details>() .Property(t => t.Location) .HasMaxLength(20);
modelBuilder.Entity<OnsiteCourse>() .Property(t => t.Details.Location) .HasMaxLength(20);
顯示設定為復雜類型:
modelBuilder.ComplexType<ClassA>();
將屬性配置為用作樂觀並發令牌:
方法1、用 ConcurrencyCheck 特性或 IsConcurrencyToken 方法
modelBuilder.Entity<OfficeAssignment>() .Property(t => t.Timestamp) .IsConcurrencyToken();
方法2、IsRowVersion
modelBuilder.Entity<OfficeAssignment>() .Property(t => t.Timestamp) .IsRowVersion();
忽略類型,不映射到數據庫中:
modelBuilder.Ignore<OnlineCourse>();