一、表名映射
我們知道:如果是在默認情況下,使用EFCore Code First的方式生成的表名跟數據上下文類中定義的實體屬性的名稱是一致的,例如:
public DbSet<Blog> Bloges123 { get; set; }
這里定義的屬性名稱是Bloges123,那么最后數據庫中生成的表名也叫Bloges123。看下面的測試。
我們首先添加遷移,每次遷移都會生成一個對應的遷移記錄類,代碼如下圖所示:
可以看到,這里顯示創建表的名稱就是Bloges123。最后更新數據庫,更新完成以后查看數據庫生成的表名:
可以看到:數據庫里面最終生成的表名就是配置的實體屬性的命名。如果我們不想使用自動生成的表名,那該怎么辦呢?這時候就需要做表名映射了,在代碼里面設置最后生成的數據庫表名。
如果要做映射,需要在數據上下文類中重寫父類的OnModelCreating方法,里面有一個ToTable()的方法,里面的參數就是你想生成的表名,如下圖所示:
修改后的數據上下文類代碼如下:
using EFCore.Model; using Microsoft.EntityFrameworkCore; namespace EFCore.Data { /// <summary> /// 數據上下文 /// </summary> public class EFDbContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=EFTest;User ID=sa;Password=123456;"); } public DbSet<Blog> Blogs { get; set; } /// <summary> /// 重寫OnModelCreating方法,配置映射 /// </summary> /// <param name="modelBuilder"></param> protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置表名映射 modelBuilder.Entity<Blog>().ToTable("Blog"); base.OnModelCreating(modelBuilder); } } }
這樣設置完成以后,我們在次使用數據遷移的方式來生成數據庫,看看最終結果。添加遷移以后生成的遷移記錄類:
可以看到:遷移記錄類里面顯示生成的表名是我們自己配置的表名,然后更新數據庫,查看數據庫表名:
這樣就完成了表名映射,最終生成的就是我們自己配置的表名。
注意:設置表名的時候有一個限制:表名最大長度限制為128。
我們修改代碼,設置的表名長度超過128看看效果:
var tableName = string.Join("", Enumerable.Repeat("t", 250).ToArray()); modelBuilder.Entity<Blog>().ToTable(tableName);
使用遷移的方式生成數據庫查看效果:
可以看到,在更新數據庫的時候報錯了,提示超過了最大長度。