1. 程式人生 > >ef core資料庫遷移,初始化種子資料

ef core資料庫遷移,初始化種子資料

起因:早上偶然看見一篇文章說是ef core(2.x)使用種子資料,主表子表遷移時候,正常情況下說是無法遷移成功,索性就試試,結果是和ef6的一樣,沒感覺有什麼大的區別。一切OK,見下面內容。

  1.首先我們依舊按照慣常的方式建立幾個Entity實體物件,如下圖,幾個實體應該不用說明什麼意思,很顯而易見,最下面的 UserRolePermission是role和permission的中間表,(多對多拆分一對一)

  那麼這裡自然的就包含了主表和子表之間的主外來鍵引用關係了。

  

  2.然後依舊按照慣常方式建立一個Entity的實體物件的EntityTypeConfiguration物件,如下圖:其中的 SeedData資料夾中的類是 EntityTypeBuilder的擴充套件類(看名字也知道了),主要放的就是種子資料了。

  其中的 SeedData下的類內容:

public static class EntityTypeBuilderExtensions
    {
        #region permissionIds
        private static Guid permissionId_01 = CombGuid.NewGuid();
        private static Guid permissionId_02 = CombGuid.NewGuid();
        private static Guid permissionId_03 = CombGuid.NewGuid();
        
private static Guid permissionId_04 = CombGuid.NewGuid(); private static Guid permissionId_05 = CombGuid.NewGuid(); private static Guid permissionId_06 = CombGuid.NewGuid(); private static Guid permissionId_07 = CombGuid.NewGuid(); private static Guid permissionId_08 = CombGuid.NewGuid();
private static Guid permissionId_09 = CombGuid.NewGuid(); private static Guid permissionId_10 = CombGuid.NewGuid(); private static Guid permissionId_11 = CombGuid.NewGuid(); private static Guid permissionId_12 = CombGuid.NewGuid(); private static Guid permissionId_13 = CombGuid.NewGuid(); #endregion #region roleId private static Guid roleId_01 = CombGuid.NewGuid(); private static Guid roleId_02 = CombGuid.NewGuid(); private static Guid roleId_03 = CombGuid.NewGuid(); #endregion #region userExtensionId private static Guid userExtensionId_01 = CombGuid.NewGuid(); #endregion public static EntityTypeBuilder HasDataPermissionSeed(this EntityTypeBuilder<PermissionSeed> builder) { var permissions = new List<PermissionSeed>() { new PermissionSeed(){ ID = permissionId_01,ControllerName="",ActionName="",IsDisabled=0,OrderIndex=0,Description=@"系統管理" }, new PermissionSeed(){ ID = permissionId_02,ControllerName="",ActionName="",IsDisabled=0,OrderIndex=1,Description=@"組織架構" }, new PermissionSeed(){ ID = permissionId_03,ControllerName="",ActionName="",IsDisabled=0,OrderIndex=2,Description=@"內容管理" }, new PermissionSeed(){ ID = permissionId_04,ControllerName="",ActionName="",IsDisabled=0,OrderIndex=3,Description=@"統計報表" }, new PermissionSeed(){ ID = permissionId_05,ParentPermissionID=permissionId_01,ControllerName="SystemSetting",ActionName="Index",IsDisabled=0,OrderIndex=0,Description=@"系統設定" }, new PermissionSeed(){ ID = permissionId_06,ParentPermissionID=permissionId_01,ControllerName="SystemSetting",ActionName="Other",IsDisabled=0,OrderIndex=1,Description=@"其他設定" }, new PermissionSeed(){ ID = permissionId_07,ParentPermissionID=permissionId_02,ControllerName="PermissionManager",ActionName="Index",IsDisabled=0,OrderIndex=0,Description=@"許可權管理" }, new PermissionSeed(){ ID = permissionId_08,ParentPermissionID=permissionId_02,ControllerName="RoleManager",ActionName="Index",IsDisabled=0,OrderIndex=1,Description=@"角色管理" }, new PermissionSeed(){ ID = permissionId_09,ParentPermissionID=permissionId_02,ControllerName="UserManager",ActionName="Index",IsDisabled=0,OrderIndex=2,Description=@"使用者管理" }, new PermissionSeed(){ ID = permissionId_10,ParentPermissionID=permissionId_03,ControllerName="ArticleManager",ActionName="Index",IsDisabled=0,OrderIndex=0,Description=@"文章管理" }, new PermissionSeed(){ ID = permissionId_11,ParentPermissionID=permissionId_03,ControllerName="VideoManager",ActionName="Index",IsDisabled=0,OrderIndex=1,Description=@"視訊管理" }, new PermissionSeed(){ ID = permissionId_12,ParentPermissionID=permissionId_04,ControllerName="TongJiManager",ActionName="Index",IsDisabled=0,OrderIndex=0,Description=@"統計管理" }, new PermissionSeed(){ ID = permissionId_13,ParentPermissionID=permissionId_04,ControllerName="BaoBiaoManager",ActionName="Index",IsDisabled=0,OrderIndex=0,Description=@"報表管理" }, }; builder.HasData(permissions.ToArray()); return builder; } public static EntityTypeBuilder HasDataRole(this EntityTypeBuilder builder) { var roles = new List<UserRole>() { new UserRole(){ID = roleId_01,RoleName = @"超級管理員",IsDisabled = Entity.Enums.IsDisabled.UnDisable,CreateTime = DateTime.Now}, new UserRole(){ID = roleId_02,RoleName = @"管理員",IsDisabled = Entity.Enums.IsDisabled.UnDisable,CreateTime = DateTime.Now}, new UserRole(){ID = roleId_03,RoleName = @"金筆寫手",IsDisabled = Entity.Enums.IsDisabled.UnDisable,CreateTime = DateTime.Now}, }; builder.HasData(roles.ToArray()); return builder; } public static EntityTypeBuilder HasDataRolePermission(this EntityTypeBuilder builder) { var rolePermissions = new List<UserRolePermission>() { new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_01,UserRoleID = roleId_01} , new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_02,UserRoleID = roleId_01} , new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_03,UserRoleID = roleId_01} , new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_04,UserRoleID = roleId_01} , new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_05,UserRoleID = roleId_01} , new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_06,UserRoleID = roleId_01} , new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_07,UserRoleID = roleId_01} , new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_08,UserRoleID = roleId_01} , new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_09,UserRoleID = roleId_01} , new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_10,UserRoleID = roleId_01} }; builder.HasData(rolePermissions.ToArray()); return builder; } public static EntityTypeBuilder HasDataUserExtension(this EntityTypeBuilder builder) { var userExtensions = new List<UserExtension>() { new UserExtension() { ID =userExtensionId_01, AccountBalance=0, Integral = 0, ReadCoin = 1000 } }; builder.HasData(userExtensions.ToArray()); return builder; } public static EntityTypeBuilder HasDataUser(this EntityTypeBuilder builder) { var users = new List<User>() { new User(){ ID = CombGuid.NewGuid(),CreateTime = DateTime.Now,Gender = Entity.Enums.GenderEnum.Man,HeadImage="", IsDisabled = Entity.Enums.IsDisabled.UnDisable,LoginAccount = "thomas",LoginPassword="123qwe",NickName="thomas", Remark = "seed初始化種子資料",Telphone="15251820632",UserRoleID = roleId_01,UserEctensionID=userExtensionId_01 }, new User(){ ID = CombGuid.NewGuid(),CreateTime = DateTime.Now,Gender = Entity.Enums.GenderEnum.Man,HeadImage="", IsDisabled = Entity.Enums.IsDisabled.UnDisable,LoginAccount = "thomas",LoginPassword="123qwe",NickName="thomas", Remark = "seed初始化種子資料",Telphone="15251820632",UserRoleID = roleId_01,UserEctensionID=userExtensionId_01 }, }; builder.HasData(users.ToArray()); return builder; } }
View Code

  然後我們只需要在對應的 EntityTypeConfiguration直接使用擴充套件方法就行了,如下圖其中一個示例:

  

  3.那麼至此,我們該建立的全建立完了,其他的,至於上下文物件(dbContext的建立),專案的建立(我這裡建立的是一個web api專案),就省略了,,很簡單。

  4.開始我們的資料遷移操作:(我這裡使用的sqlServer資料庫)

  說個題外話:我們在遷移的時候,可以在,DbContextOptionsBuilder (builder)builder.UseSqlServer這個擴充套件的時候,可以指定 migrations檔案生成的所在目錄,(當然這裡會提示你事先需要實現IDesignTimeDbContextFactory這個介面,,比較簡單,省略)

  比如我直接指定生成在我的webapi的(presentation層,這也很合理,假設我如果使用的其他的資料庫,比如sqlLite,這個builder就不是UserSQlServer了,是依據實際應用而定的)。

  如圖:

  

  遷移: nuget 輸入

  add-migration init //不區分大小寫,,哪來那麼多要求,,

  此時執行結果如下圖:

  

  然後看看我們專案裡生成了啥(webapi)

   

  5.目前我們成功生成了 遷移所需的遷移檔案,但是還沒遷移,這裡如果 上下文沒有設定 自動遷移的話,需要手動執行  updata-database去遷移生成資料庫,

  設定自動遷移:

  

  或直接手動,繼續在 nuget輸入 updata-database即可,

   看我們呢執行的結果:

  PermissionSeed表:

  User表:

  

  Role表:

  

  role和許可權的中間表 rolePermission表:

  

  一切OK,沒有出現說無法正常初始化的問題,