CodeFirst Fluent API使用記錄
我們在使用EF CodeFirst 模式生成資料庫的時候進行表的程式碼對映關係可以採用註解模式和Fluent API模式。這裡就是記錄一下使用Fluent API進行表關係對映的方法。
註解模式:
回顧一下我們以前都知道的註解模式,一個表,在表的欄位上和表上增加相應的註解進行對映即可:
[Table("SysErrorLogInfor")] public partial class SysErrorLogInfor { [Key] public string id { get; set; } [Required] //必填 public int userId { get; set; } [MinLength(10)]//最小長度 public string userName { get; set; } [MaxLength]//最大長度 public string logLevel { get; set; } public string logMessage { get; set; } public DateTime? addTime { get; set; } public int? delFlag { get; set; } }
Fluent API
那麼我們如果同樣使用Fluent API模式改如何實現哪,首先我寫這個不是說Fluen API 比註解模式好,只是做個簡單比較。不過使用Fluen API 模式可以使物件表更純潔化。更加的整潔,但是同樣的因為整潔了,少了很多東西,就需要在別的地方增加相應的東西。
你不寫資料庫是不知道你這個欄位要幹嘛是什麼作用,有那些限制的。
還是剛才的那張表,現在改成這個樣:
public partial class SysErrorLogInfor { public string id { get; set; } public int userId { get; set; } public string userName { get; set; } public string logLevel { get; set; } public string logMessage { get; set; } public DateTime? addTime { get; set; } public int? delFlag { get; set; } }
很清晰,這張表只為了表明當前表所存在那些欄位和型別,但是具體的欄位限制是不能辨別的。剛才也說了少一些東西必然增加一些東西,所有為了讓對映知道我欄位有那些限制我們還是要指定表的欄位,那就要在建立一個規則類(這就是多出來的):
我們建立一個SysErrorLogInforMap類,這裡此類需要基礎 EntityTypeConfiguration<T>泛型所有需要新增引用:using System.Data.Entity.ModelConfiguration;
然後在該類的建構函式中設定SysErrorLogInfor表其中的屬性欄位程式碼如下:
public class SysErrorLogInforMap : EntityTypeConfiguration<SysErrorLogInfor> { public SysErrorLogInforMap() { //配置屬性欄位 Property(t => t.id).HasMaxLength(32); Property(t => t.userName).HasMaxLength(50); Property(t => t.logLevel).HasMaxLength(50); //配置表名 ToTable("SysErrorLogInfor"); } }
這樣你就對SysErrorLogInfor表設定了一個規則類,然後我們只需要啟動這個規則就可以了,我們在上下文中的OnModelCreating方法中啟動此規則,啟動規則可以單個表的啟用也可以全部啟用(在表多的情況下):
注意:在OnModelCreating方法中配置Fluent API
Code First配置優先順序為:Fluent API > DataAnnotations > default conventions
protected override void OnModelCreating(DbModelBuilder modelBuilder) { //手動載入 //modelBuilder.Configurations.Add(new SysErrorLogInforMap()); //全部載入 modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly()); }
配置方法
配置的規則非常多,我就不列舉所有了你可以通過程式碼檢視所有隻說比較常用的幾個
HasKey:配置主鍵
Property:配置那個屬性,這個一般都是會在其後跟隨配置的其他一個規則例如上面的之後跟隨一個長度限制
HasMaxLength:最大長度
IsFixedLength:固定為多少位
IsOptional:將屬性配置為可選屬性。用於儲存此屬性的資料庫列將可以為 null。
IsRequired:將屬性配置為必需屬性。用於儲存此屬性的資料庫列將不可以為 null。
IsUnicode:將屬性配置為支援 Unicode 字串內容。
HasColumnName: 配置用於儲存屬性的資料庫列的名稱,這個我覺得就是一個是在程式碼中的屬性名然後可以設定為資料庫列名不同。
HasColumnType:配置用於儲存屬性的資料庫列的資料型別,這個非常有用因為c#設定的string型別在對映到資料會自動成nvarchar(int)型別這個可以指定為varchar(int)型別,截圖說明:
資料庫策略問題
這裡特別注意哦:配置表名那個地方如果你不寫的話,加入你的EF模式配置的是關閉資料庫生成策略的話你會發現意向不到的意外哦因為資料庫的預設生成策略是複數形式所有當你啟用關閉資料庫生成策略的時候你會查不到表的錯誤。
當然你也不必像上面那樣每個表都配置表名,可以在直接使用提供的方法關閉複數策略形式:
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
關閉資料庫生成策略程式碼示例:
public BaseDBContent() : base("name=Entity") { Database.SetInitializer<BaseDBContent>(null); }
其他策略:
資料庫不存在時重新建立資料庫
Database.SetInitializer(new CreateDatabaseIfNotExists<BaseDBContent>());
每次啟動應用程式時建立資料庫(其實預設的不做任何配置就是會自動建立資料庫的)
Database.SetInitializer(new DropCreateDatabaseAlways<BaseDBContent>());
模型更改時重新建立資料庫
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<BaseDBContent>());
Code First預設規則
表及列預設規則:EF Code First預設生成的表名為類名的複數形式
主鍵約束:實體類中屬性名為Id或[類名]Id,將作為生成表的主鍵。若主鍵為int型別,則預設為Sql Server的Identity型別
字元型別屬性:實體類中string型別的屬性,在生成表時,對應Sql Server中nvarchar(max)型別
Byte Array型別約束:實體類中byte[]型別的屬性,生成表時對應Sql Server中varbinary(max)型別
Boolean型別約束:實體類中bool型別的屬性,在生成表是對應Sql Server中bit型別