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

标签 c# entity-framework asp.net-core .net-core entity-framework-core

每当我创建一个新的迁移时,出于某种原因,我的种子数据总是被删除并重新创建。我怎样才能防止这种情况发生?

这似乎是 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==");
        }

最佳答案

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

关于c# - EF Core 2.2 新迁移不断删除和重新创建种子数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61315107/

相关文章:

c# - 最通用的数组类型?

c# - 正则表达式不匹配单词边界之间的哈希字符

c# - 如何强制隐藏字段的标签助手以小写形式呈现 bool 值

ssl - 如何在没有 IIS 的情况下在 Windows Server 2016 中安装 ssl 证书?

c# - 如何在 ASP.NET Core 中的 DbSet 实例上使用 Find(params object[] keyValues) 方法?

c# - 自动为图像添加水印

c# - WPF App,在打开窗口之前运行异步任务

performance - 在 Entity Framework LINQ 查询中使用 IEnumerable.Contains 时如何避免查询计划重新编译?

c# - 找不到用于带有 Entity Framework 的 MVC 4 的数据库

c# - 检索修改后的引用的原始值