gol*_*ldN 5 c# entity-framework .net-core
我遇到的问题是 EF Core 不允许我添加第二次迁移。\n我有以下 DataContext 设置:
\n\npublic class DataContext : IdentityDbContext<User, Role, Guid, IdentityUserClaim<Guid>, UserRole, IdentityUserLogin<Guid>, IdentityRoleClaim<Guid>, IdentityUserToken<Guid>>\n{\n public DataContext(DbContextOptions<DataContext> options)\n : base(options)\n {\n }\n\n /* Global */\n public virtual DbSet<Audit> Audits { get; set; }\n public virtual DbSet<AuditType> AuditType { get; set; }\n\n /* Portal */\n public virtual DbSet<RefreshToken> RefreshTokens { get; set; }\n public virtual DbSet<Product> Products { get; set; }\n public virtual DbSet<Group> Groups { get; set; }\n public virtual DbSet<GroupType> GroupTypes { get; set; }\n public virtual DbSet<GroupProperty> GroupProperties { get; set; }\n\n\n /* SVault */\n public virtual DbSet<LicensePropertyType> LicensePropertyTypes { get; set; }\n public virtual DbSet<LicenseProduct> LicenseProducts { get; set; }\n public virtual DbSet<LicenseState> LicenseStates { get; set; }\n public virtual DbSet<LicenseType> LicenseTypes { get; set; }\n public virtual DbSet<LicenseStatus> LicenseStatus { get; set; }\n public virtual DbSet<BackupState> BackupStates { get; set; }\n public virtual DbSet<BackupMode> BackupModes { get; set; }\n\n protected override void OnModelCreating(ModelBuilder modelBuilder)\n {\n IList<AuditType> audittypes = new List<AuditType>()\n {\n new AuditType() { Id = 1, Name = "USER_CREATE" },\n new AuditType() { Id = 2, Name = "USER_UPDATE" },\n new AuditType() { Id = 3, Name = "USER_DELETE" },\n new AuditType() { Id = 4, Name = "USER_RESET_PASSWORD" },\n new AuditType() { Id = 5, Name = "USER_2FA_GENERATE" },\n new AuditType() { Id = 6, Name = "USER_TOKEN_GENERATE" },\n new AuditType() { Id = 7, Name = "USER_REQUEST_RESET_PASSWORD" },\n\n new AuditType() { Id = 20, Name = "ROLE_ADD" },\n new AuditType() { Id = 21, Name = "ROLE_DELETE" },\n\n new AuditType() { Id = 30, Name = "GROUP_CREATE" },\n new AuditType() { Id = 31, Name = "GROUP_UPDATE" },\n new AuditType() { Id = 32, Name = "GROUP_DELETE" },\n\n new AuditType() { Id = 35, Name = "GROUP_PROPERTY_ADD" },\n new AuditType() { Id = 36, Name = "GROUP_PROPERTY_DELETE" },\n\n new AuditType() { Id = 50, Name = "SVAULT_LICENSE_CREATE", ProductId = 1 },\n new AuditType() { Id = 51, Name = "SVAULT_LICENSE_UPDATE", ProductId = 1 },\n new AuditType() { Id = 52, Name = "SVAULT_LICENSE_DELETE", ProductId = 1 },\n new AuditType() { Id = 53, Name = "SVAULT_LICENSE_VALIDATE_TRIAL", ProductId = 1 },\n new AuditType() { Id = 54, Name = "SVAULT_LICENSE_MIGRATE", ProductId = 1 },\n new AuditType() { Id = 55, Name = "SVAULT_LICENSE_PROPERTIES_UPDATE", ProductId = 1 },\n\n new AuditType() { Id = 70, Name = "SVAULT_DATASET_CREATE", ProductId = 1 },\n new AuditType() { Id = 71, Name = "SVAULT_DATASET_UPDATE", ProductId = 1 },\n new AuditType() { Id = 72, Name = "SVAULT_DATASET_DELETE", ProductId = 1 },\n new AuditType() { Id = 73, Name = "SVAULT_DATASET_RESTORE", ProductId = 1 },\n new AuditType() { Id = 74, Name = "SVAULT_DATASET_BACKUP", ProductId = 1 },\n\n new AuditType() { Id = 80, Name = "SVAULT_DATASET_SCHED_CREATE", ProductId = 1 },\n new AuditType() { Id = 81, Name = "SVAULT_DATASET_SCHED_UPDATE", ProductId = 1 },\n new AuditType() { Id = 82, Name = "SVAULT_DATASET_SCHED_DELETE", ProductId = 1 },\n };\n\n Guid mProvider = Guid.NewGuid();\n\n IList<User> users = new List<User>()\n {\n new User() { Id = Guid.NewGuid(), UserName = "*****************", NormalizedUserName = "*****************".ToUpper(), Email = "*****************", NormalizedEmail = "*****************".ToUpper(), EmailConfirmed = true, PasswordHash = "*****************", SecurityStamp = "*****************", ConcurrencyStamp = "*****************", PhoneNumber = null, PhoneNumberConfirmed = false, TwoFactorEnabled = false, LockoutEnd = null, LockoutEnabled = true, AccessFailedCount = 0, FirstName = "*****************", LastName = "*****************", IsAdmin = true, GroupId = mProvider },\n new User() { Id = Guid.NewGuid(), UserName = "*****************", NormalizedUserName = "*****************".ToUpper(), Email = "*****************", NormalizedEmail = "*****************".ToUpper(), EmailConfirmed = true, PasswordHash = "*****************", SecurityStamp = "*****************", ConcurrencyStamp = "*****************", PhoneNumber = null, PhoneNumberConfirmed = false, TwoFactorEnabled = false, LockoutEnd = null, LockoutEnabled = true, AccessFailedCount = 0, FirstName = "*****************", LastName = "*****************", IsAdmin = true, GroupId = mProvider }\n };\n\n IList<Product> products = new List<Product>()\n {\n new Product(){ Id = 1 ,LongName = "AGS Backup SVault", Description = String.Empty, ShortName = "SVault", RouteUrl = "/svault/dashboard", IconUrl = "assets/images/picto/picto_backup.svg", ThemeColor = "ags-500", Enabled = true },\n new Product(){ Id = 2 ,LongName = "AGS Hosting", Description = String.Empty, ShortName = "Hosting", RouteUrl = "/hosting/dashboard", IconUrl = "assets/images/picto/picto_hosting.svg", ThemeColor = "ags-600", Enabled = false },\n new Product(){ Id = 3 ,LongName = "AGS VEEAM Cloud Connect", Description = String.Empty, ShortName = "VEEAM", RouteUrl = "/veeam/dashboard", IconUrl = "assets/images/picto/picto_veeam.svg", ThemeColor = "ags-300", Enabled = false },\n new Product(){ Id = 4 ,LongName = "AGS Mail Zimbra", Description = String.Empty, ShortName = "Zimbra", RouteUrl = "/mail/dashboard", IconUrl = "assets/images/picto/picto_messagerie.svg", ThemeColor = "ags-700", Enabled = false },\n new Product(){ Id = 5 ,LongName = "AGS Mail Exchange", Description = String.Empty, ShortName = "Exchange", RouteUrl = "/mail/dashboard", IconUrl = "assets/images/picto/picto_messagerie.svg", ThemeColor = "ags-700", Enabled = false },\n new Product(){ Id = 6 ,LongName = "AGS Office365", Description = String.Empty, ShortName = "Office365", RouteUrl = "/office365/dashboard", IconUrl = "assets/images/picto/picto_office.svg", ThemeColor = "ags-800", Enabled = false },\n new Product(){ Id = 7 ,LongName = "AGS MailProtect", Description = String.Empty, ShortName = "MailProtect", RouteUrl = "/mailprotect/dashboard", IconUrl = "assets/images/picto/picto_protect.svg", ThemeColor = "ags-900", Enabled = false },\n new Product(){ Id = 8 ,LongName = "AGS MailInBlack", Description = String.Empty, ShortName = "MailInBlack", RouteUrl = "/mailinblack/dashboard", IconUrl = "assets/images/picto/picto_protect.svg", ThemeColor = "ags-900", Enabled = false },\n new Product(){ Id = 9 ,LongName = "AGS MonCloud", Description = String.Empty, ShortName = "MonCloud", RouteUrl = "/moncloud/dashboard", IconUrl = "assets/images/picto/picto_moncloud.svg", ThemeColor = "ags-400", Enabled = false }\n };\n IList<Role> roles = new List<Role>()\n {\n /* SVault Roles */\n new Role() { Id = Guid.NewGuid(), ProductId = 1, Name = RolesHelper.SvaultRoles.RoleAdmin, NormalizedName = RolesHelper.SvaultRoles.RoleAdmin.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 1, Name = RolesHelper.SvaultRoles.RoleBackup, NormalizedName = RolesHelper.SvaultRoles.RoleBackup.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 1, Name = RolesHelper.SvaultRoles.RoleRestore, NormalizedName = RolesHelper.SvaultRoles.RoleRestore.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 1, Name = RolesHelper.SvaultRoles.RoleRead, NormalizedName = RolesHelper.SvaultRoles.RoleRead.ToUpper() },\n\n /* Hosting Roles */\n new Role() { Id = Guid.NewGuid(), ProductId = 2, Name = RolesHelper.HostingRoles.RoleAdmin, NormalizedName = RolesHelper.HostingRoles.RoleAdmin.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 2, Name = RolesHelper.HostingRoles.RoleCreate, NormalizedName = RolesHelper.HostingRoles.RoleCreate.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 2, Name = RolesHelper.HostingRoles.RoleDelete, NormalizedName = RolesHelper.HostingRoles.RoleDelete.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 2, Name = RolesHelper.HostingRoles.RoleEdit, NormalizedName = RolesHelper.HostingRoles.RoleEdit.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 2, Name = RolesHelper.HostingRoles.RoleRead, NormalizedName = RolesHelper.HostingRoles.RoleRead.ToUpper() },\n\n /* VEEAM Roles */\n new Role() { Id = Guid.NewGuid(), ProductId = 3, Name = RolesHelper.VEEAMRoles.RoleAdmin, NormalizedName = RolesHelper.VEEAMRoles.RoleAdmin.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 3, Name = RolesHelper.VEEAMRoles.RoleBackup, NormalizedName = RolesHelper.VEEAMRoles.RoleBackup.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 3, Name = RolesHelper.VEEAMRoles.RoleRestore, NormalizedName = RolesHelper.VEEAMRoles.RoleRestore.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 3, Name = RolesHelper.VEEAMRoles.RoleRead, NormalizedName = RolesHelper.VEEAMRoles.RoleRead.ToUpper() },\n\n /* Mail Roles */\n new Role() { Id = Guid.NewGuid(), ProductId = 4, Name = RolesHelper.MailRoles.RoleAdmin, NormalizedName = RolesHelper.MailRoles.RoleAdmin.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 4, Name = RolesHelper.MailRoles.RoleCreate, NormalizedName = RolesHelper.MailRoles.RoleCreate.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 4, Name = RolesHelper.MailRoles.RoleDelete, NormalizedName = RolesHelper.MailRoles.RoleDelete.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 4, Name = RolesHelper.MailRoles.RoleEdit, NormalizedName = RolesHelper.MailRoles.RoleEdit.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 4, Name = RolesHelper.MailRoles.RoleRead, NormalizedName = RolesHelper.MailRoles.RoleRead.ToUpper() },\n\n /* Mail Office */\n new Role() { Id = Guid.NewGuid(), ProductId = 5, Name = RolesHelper.Office365Roles.RoleAdmin, NormalizedName = RolesHelper.Office365Roles.RoleAdmin.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 5, Name = RolesHelper.Office365Roles.RoleCreate, NormalizedName = RolesHelper.Office365Roles.RoleCreate.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 5, Name = RolesHelper.Office365Roles.RoleDelete, NormalizedName = RolesHelper.Office365Roles.RoleDelete.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 5, Name = RolesHelper.Office365Roles.RoleEdit, NormalizedName = RolesHelper.Office365Roles.RoleEdit.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 5, Name = RolesHelper.Office365Roles.RoleRead, NormalizedName = RolesHelper.Office365Roles.RoleRead.ToUpper() },\n\n /* MailProtect Roles */\n new Role() { Id = Guid.NewGuid(), ProductId = 6, Name = RolesHelper.MailProtectRoles.RoleAdmin, NormalizedName = RolesHelper.MailProtectRoles.RoleAdmin.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 6, Name = RolesHelper.MailProtectRoles.RoleCreate, NormalizedName = RolesHelper.MailProtectRoles.RoleCreate.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 6, Name = RolesHelper.MailProtectRoles.RoleDelete, NormalizedName = RolesHelper.MailProtectRoles.RoleDelete.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 6, Name = RolesHelper.MailProtectRoles.RoleEdit, NormalizedName = RolesHelper.MailProtectRoles.RoleEdit.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 6, Name = RolesHelper.MailProtectRoles.RoleRead, NormalizedName = RolesHelper.MailProtectRoles.RoleRead.ToUpper() },\n\n /* MonCloud Roles */\n new Role() { Id = Guid.NewGuid(), ProductId = 7, Name = RolesHelper.MonCloudRoles.RoleAdmin, NormalizedName = RolesHelper.MonCloudRoles.RoleAdmin.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 7, Name = RolesHelper.MonCloudRoles.RoleSync, NormalizedName = RolesHelper.MonCloudRoles.RoleSync.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 7, Name = RolesHelper.MonCloudRoles.RoleRestore, NormalizedName = RolesHelper.MonCloudRoles.RoleRestore.ToUpper() },\n new Role() { Id = Guid.NewGuid(), ProductId = 7, Name = RolesHelper.MonCloudRoles.RoleRead, NormalizedName = RolesHelper.MonCloudRoles.RoleRead.ToUpper() },\n };\n\n IList<GroupType> grouptypes = new List<GroupType>()\n {\n new GroupType() { Id = 1, Name = "Cloud Provider", PictoName = "cloud" },\n new GroupType() { Id = 2, Name = "Partenaire", PictoName = "supervisor_account" },\n new GroupType() { Id = 3, Name = "Client", PictoName = "group" },\n new GroupType() { Id = 4, Name = "Groupe", PictoName = "folder" }\n };\n\n IList<Group> groups = new List<Group>()\n {\n new Group() { Id = mProvider, Name = "AGS Cloud", GroupTypeId = 1, ParentGroupId = null },\n };\n\n IList<GroupProperty> groupProperties = new List<GroupProperty>()\n {\n new GroupProperty() { Id = Guid.NewGuid(), ProductId = 1, GroupId = mProvider, Name = Domain.Portal.GroupProperties.community_id.ToString(), Value = Guid.Empty.ToString() }\n };\n\n IList<LicenseType> licenseTypes = new List<LicenseType>()\n {\n new LicenseType() { Id = 1, Name = "Cloud", IsFilterable = true, OrderBy = 1 },\n new LicenseType() { Id = 2, Name = "Hybrid Mirroir", IsFilterable = true, OrderBy = 2 },\n new LicenseType() { Id = 4, Name = "Hybrid Illimit\xc3\xa9e", IsFilterable = true, OrderBy = 3 },\n new LicenseType() { Id = 8, Name = "Locale", IsFilterable = true, OrderBy = 4 }\n };\n\n IList<LicenseStatus> licenseStatus = new List<LicenseStatus>()\n {\n new LicenseStatus() { Id = -1, Name = "NotInstalled", IconName = "highlight_off", IconColor = "grey-600-fg", IsFilterable = true, OrderBy = 3 },\n new LicenseStatus() { Id = 0, Name = "Online", IconName = "wifi", IconColor = "green-600-fg", IsFilterable = true, OrderBy = 1 },\n new LicenseStatus() { Id = 1, Name = "Disabled", IconName = "delete", IconColor = "red-600-fg", IsFilterable = false },\n new LicenseStatus() { Id = 2, Name = "MarkForDelete", IconName = "delete_forever", IconColor = "red-600-fg", IsFilterable = false },\n new LicenseStatus() { Id = 4, Name = "Detached", IconName = "indeterminate_check_box", IconColor = "red-600-fg", IsFilterable = false },\n new LicenseStatus() { Id = 8, Name = "Offline", IconName = "wifi_off", IconColor = "red-600-fg", IsFilterable = true, OrderBy = 2 }\n };\n\n IList<LicenseState> licenseStates = new List<LicenseState>()\n {\n new LicenseState() { Id = 0, Name = "NotInstalled", IconName = "highlight_off", IconColor = "grey-600-fg", IsFilterable = true, OrderBy = 9 },\n new LicenseState() { Id = 1, Name = "NotConfigured", IconName = "perm_data_setting", IconColor = "grey-600-fg", IsFilterable = true, OrderBy = 8 },\n new LicenseState() { Id = 2, Name = "Failed", IconName = "sms_failed", IconColor = "red-600-fg", IsFilterable = true, OrderBy = 7 },\n new LicenseState() { Id = 3, Name = "NotConnected", IconName = "wifi_off", IconColor = "red-600-fg", IsFilterable = true, OrderBy = 6 },\n new LicenseState() { Id = 4, Name = "Suspended", IconName = "pause", IconColor = "orange-600-fg", IsFilterable = true, OrderBy = 5 },\n new LicenseState() { Id = 5, Name = "Killed", IconName = "stop", IconColor = "orange-600-fg", IsFilterable = true, OrderBy = 4 },\n new LicenseState() { Id = 6, Name = "Maintenance", IconName = "outlined_flag", IconColor = "blue-600-fg", IsFilterable = true, OrderBy = 3 },\n new LicenseState() { Id = 7, Name = "Running", IconName = "play_circle_outline", IconColor = "yellow-600-fg", IsFilterable = true, OrderBy = 2 },\n new LicenseState() { Id = 8, Name = "Completed", IconName = "check", IconColor = "green-600-fg", IsFilterable = true, OrderBy = 1 }\n };\n\n IList<BackupMode> backupmodes = new List<BackupMode>()\n {\n new BackupMode() { Id = 1, Name = "Cloud", IconName = "cloud", IconColor = "blue-600-fg" },\n new BackupMode() { Id = 2, Name = "Locale", IconName = "dns", IconColor = "grey-600-fg" },\n new BackupMode() { Id = 4, Name = "Cloud & Locale", IconName = "all_inclusive", IconColor = "light-blue-300-fg" }\n };\n\n /* Code to allow 0 value in BackupState -> Id */\n modelBuilder.Entity<LicenseState>().Property(p => p.Id).ValueGeneratedNever();\n modelBuilder.Entity<BackupState>().Property(p => p.Id).ValueGeneratedNever();\n modelBuilder.Entity<LicenseStatus>().Property(p => p.Id).ValueGeneratedNever();\n /* End */\n\n modelBuilder.Entity<GroupType>().HasData(grouptypes);\n modelBuilder.Entity<Group>().HasData(groups);\n modelBuilder.Entity<Product>().HasData(products);\n modelBuilder.Entity<Role>().HasData(roles);\n modelBuilder.Entity<User>().HasData(users);\n modelBuilder.Entity<LicenseType>().HasData(licenseTypes);\n modelBuilder.Entity<LicenseStatus>().HasData(licenseStatus);\n modelBuilder.Entity<LicenseState>().HasData(licenseStates);\n modelBuilder.Entity<BackupMode>().HasData(backupmodes);\n modelBuilder.Entity<GroupProperty>().HasData(groupProperties);\n modelBuilder.Entity<AuditType>().HasData(audittypes);\n\n base.OnModelCreating(modelBuilder);\n\n /* Has to be set up after base.OnModelCreating */\n modelBuilder.Entity<UserRole>(userRole =>\n {\n userRole.HasKey(ur => new { ur.UserId, ur.RoleId });\n\n userRole.HasOne(ur => ur.Role)\n .WithMany(r => r.UserRoles)\n .HasForeignKey(ur => ur.RoleId)\n .IsRequired();\n\n userRole.HasOne(ur => ur.User)\n .WithMany(r => r.UserRoles)\n .HasForeignKey(ur => ur.UserId)\n .IsRequired();\n });\n\n modelBuilder.Entity<GroupProperty>().HasIndex(b => b.Name);\n modelBuilder.Entity<GroupProperty>().HasIndex(b => b.Value);\n\n /*modelBuilder.Entity<Group>().HasOne(b => b.ParentGroup)\n .WithMany(b => b.ChildGroupsHidden)\n .HasForeignKey(b =
根据评论编辑
“...我们必须使用固定的 Guid 或固定的 Id。否则,任何后续迁移都将使用 Guid.NewGuid() 生成新的 Guid/Id 并尝试播种新数据,不幸的是,因为我们已经将这些 Id 与某些外键,EF 无法继续。”
进行初始(或任何)迁移后,请务必运行命令Update-Database来应用迁移。从更新中应用它后,您可以进行新的迁移、更新,并根据应用程序开发中的需要重复。
例如:
对 ef 模型、代码等进行更改,然后运行添加迁移命令:
Add-Migration NewMigrationAfterChanges
Run Code Online (Sandbox Code Playgroud)
使用 update db 命令应用迁移:
Update-Database
Run Code Online (Sandbox Code Playgroud)
现在,您可以进行更改并添加新的迁移,假设它更新后没有错误或发生意外情况。有关使用 EF 核心的更多详细信息,请参阅关于 EF 的 MSDN 。
| 归档时间: |
|
| 查看次数: |
6259 次 |
| 最近记录: |