EF Core 2.2新迁移不断删除和重新创建种子数据



每当我创建一个新的迁移时,由于某种原因,我的种子数据总是被删除和重新创建。我该如何防止这种情况发生?

这似乎是EF Core 2.1中的一个错误,但据说在2.2中已经修复,但这个问题仍然存在。

这是我的OnModelCreating:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
Application application = new Application
{
Id = Guid.NewGuid().ToString(),
Name = "APPONE",
Description = "APPONE",
TagColor = "#fb3640",
IsActive = true,
CreatedOn = DateTime.Now,
UpdatedOn = DateTime.Now
};
User user = new User
{
Id = "223862af-978e-41a9-90ca-fda4b0f49c77",
UserName = "system@managementstudio.com",
NormalizedUserName = "SYSTEM@MANAGEMENTSTUDIO.COM",
Email = "system@managementstudio.com",
NormalizedEmail = "SYSTEM@MANAGEMENTSTUDIO.COM",
SecurityStamp = "42032b8b-4581-46cf-8c56-a53e155176a3",
PhoneNumber = "1234567890",
FirstName = "System",
LastName = "Administrator",
ConcurrencyStamp = "8a75b8eb-01e6-4aff-b59b-849ad93cd28e",
CreatedOn = Convert.ToDateTime("2020-04-16 19:22:09.546094"),
UpdatedOn = Convert.ToDateTime("2020-04-16 19:22:09.546094"),
PasswordHash = "AQAAAAEAACcQAAAAEATcP3mZf4Ok1uuUwpnG4v6ES3XJ4VsyiM3G9hhKgZNwen4Z3ke5DEIvK1acSJOhDQ==",
};
UserPasswordPolicy upp = new UserPasswordPolicy
{
Id = Guid.NewGuid().ToString(),
IsPolicyActivated = false,
RetentionDays = 0,
TenantId = null,
UserId = user.Id,
CreatedOn = DateTime.Now,
};
Role role = new Role
{
Id = "d5e3f676-e489-479d-b739-8ea9a8483496",
Name = "SystemAdministrator",
NormalizedName = "SYSTEMADMINISTRATOR",
ApplicationId = application.Id,
Order = 1,
ConcurrencyStamp = "ba953d0b-89dc-4550-9962-c9ba08a3980e",
};
Role role2 = new Role
{
Id = "225c067c-c703-419e-9fc9-8186ded506f8",
Name = "Administrator",
NormalizedName = "ADMINISTRATOR",
ApplicationId = application.Id,
Order = 2,
ConcurrencyStamp = "a09ab67f-02d6-4910-8659-3385759d8036",
};
UserRole userRole = new UserRole
{
RoleId = role.Id,
UserId = user.Id
};
SystemAdministrator systemAdministrator = new SystemAdministrator
{
Id = Guid.NewGuid().ToString(),
UserId = user.Id,
CreatedOn = DateTime.Now
};
//https://www.learnentityframeworkcore.com/migrations/seeding
PasswordHasher<User> passwordHasher = new PasswordHasher<User>();
user.PasswordHash = passwordHasher.HashPassword(user, "P@ssw0rd");
modelBuilder.Entity<Application>().HasData(application);
modelBuilder.Entity<User>().HasData(user);
var rolesTable = modelBuilder.Entity<Role>().ToTable("Roles");
var userRolesTable = modelBuilder.Entity<UserRole>().ToTable("UserRoles");
var userClaimsTable = modelBuilder.Entity<IdentityUserClaim<string>>().ToTable("UserClaims");
var usersTable = modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<Role>(builder =>
{
builder.Metadata.RemoveIndex(new[] { builder.Property(u => u.NormalizedName).Metadata });
});
modelBuilder.Entity<User>(builder =>
{
builder.Metadata.RemoveIndex(new[] { builder.Property(u => u.NormalizedUserName).Metadata });
});
modelBuilder.Entity<User>(builder =>
{
builder.Metadata.RemoveIndex(new[] { builder.Property(u => u.UserName).Metadata });
});
modelBuilder.Entity<User>(b =>
b.HasIndex("NormalizedUserName", "TenantId").HasName("UserNameIndex").IsUnique());
modelBuilder.Entity<Role>().HasData(role);
modelBuilder.Entity<Role>().HasData(role2);
modelBuilder.Entity<UserRole>().HasData(userRole);
modelBuilder.Entity<UserPasswordPolicy>().HasData(upp);
modelBuilder.Entity<SystemAdministrator>().HasData(systemAdministrator);
}

编辑:

我更新了我的种子,但由于某种原因,我的迁移仍然在密码哈希中显示更新:

protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.UpdateData(
table: "UserPasswordPolicy",
keyColumn: "Id",
keyValue: "845c4aff-ed80-45c3-a5c3-7dba838e575b",
column: "UpdatedOn",
value: new DateTime(2020, 4, 21, 7, 9, 46, 923, DateTimeKind.Local).AddTicks(6432));
migrationBuilder.UpdateData(
table: "Users",
keyColumn: "Id",
keyValue: "223862af-978e-41a9-90ca-fda4b0f49c77",
column: "PasswordHash",
value: "AQAAAAEAACcQAAAAEATcP3mZf4Ok1uuUwpnG4v6ES3XJ4VsyiM3G9hhKgZNwen4Z3ke5DEIvK1acSJOhDQ==");
}

这是由于ID使用Guid.NewGuid().ToString()。当EF对数据进行种子设定时(这将在每个迁移应用程序期间发生(,它使用id来确定是应该创建一个新实体还是用种子数据更新现有实体。由于id总是不同,因此它将始终创建而不是更新。如果希望更新,则需要使用静态值。

相关内容

最新更新