c# - 为什么 EF Core 2.2 总是更新“AspNetUsers”表中的“ConcurrencyStamp”、“PasswordHash”?
问题描述
我有 .net 核心应用程序,它使用 ef core 2.2 代码优先模型,当我运行时
添加迁移
它总是更新表"ConcurrencyStamp", "PasswordHash"
中的列值"AspNetUsers"
。
自动生成UP
的方法内容是
migrationBuilder.UpdateData(
table: "AspNetUsers",
keyColumn: "Id",
keyValue: new Guid("b0bea27d-5eae-4836-8f85-8bf8f1aed8d5"),
columns: new[] { "ConcurrencyStamp", "PasswordHash" },
values: new object[] { "c599b745-8e24-438b-bd62-8264102ac960", "AQAAAAEAACcQAAAAEHjqRSJuPQtzpQR7L7hUNo3vFM8P9dhHkiXQjYRpdgS1Z9I9TXQ2XwhM9CQiE0oVyg==" });
migrationBuilder.UpdateData(
table: "AspNetUsers",
keyColumn: "Id",
keyValue: new Guid("b0bea27d-5eae-4836-8f85-8bf8f1aed8d6"),
columns: new[] { "ConcurrencyStamp", "PasswordHash" },
values: new object[] { "bdbc0bcf-6eaa-489b-b2a2-9c1742a38bf4", "AQAAAAEAACcQAAAAEBpVzPQl74gxL+V93biLDmn4oKNJSZZ5VDUpwSQ/S8h+itGvGbScqG78Wi35bmN4dQ==" });
我的OnModelCreating方法如下
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurations(
typeof(SampleDBContext).Assembly,
typeof(IEntityTypeConfiguration<>));
DatabaseSeeder.Seed(modelBuilder);
}
在种子方法中,我调用了一种方法来播种应用程序用户。
private static void SeedApplicationUser(ModelBuilder modelBuilder)
{
var hasher = new PasswordHasher<ApplicationUser>();
var admin = new ApplicationUser
{
Id = Guid.Parse("b0bea27d-5eae-4836-8f85-8bf8f1aed8d4"),
RoleType = RoleTypes.Admin,
Email = "admin@gmail.io",
NormalizedEmail = "ADMIN@GMAIL.IO",
EmailConfirmed = true,
UserName = "admin",
NormalizedUserName = "ADMIN",
};
var user1 = new ApplicationUser
{
Id = Guid.Parse("b0bea27d-5eae-4836-8f85-8bf8f1aed8d5"),
RoleType = RoleTypes.User,
Email = "user1@gmail.io",
NormalizedEmail = "USER1@GMAIL.IO",
EmailConfirmed = true,
UserName = "user1",
AccessFailedCount = 0,
NormalizedUserName = "USER1",
};
var user2 = new ApplicationUser
{
Id = Guid.Parse("b0bea27d-5eae-4836-8f85-8bf8f1aed8d6"),
RoleType = RoleTypes.User,
Email = "user2@gmail.io",
NormalizedEmail = "USER2@GMAIL.IO",
EmailConfirmed = true,
UserName = "user2",
AccessFailedCount = 0,
NormalizedUserName = "USER2",
};
admin.PasswordHash = hasher.HashPassword(admin, "admin@23");
user1.PasswordHash = hasher.HashPassword(user1, "user1@23");
user2.PasswordHash = hasher.HashPassword(user2, "user2@23");
modelBuilder.Entity<ApplicationUser>()
.HasData(admin, user1, user2);
}
这是正常行为还是我错过了什么?
如果有人需要更多详细信息,请发表评论。我不知道要提供什么。
谢谢,
解决方案
ConcurrencyStamp
总是在创建新对象时生成。
public virtual string ConcurrencyStamp { get; set; } = Guid.NewGuid().ToString();
大约也是一样PasswordHash
。它的值总是在你的种子中重新生成并且总是不同的(即使是相同的密码)。
这就是 EF Core 看到数据库中的数据和种子数据之间的差异的原因。每次创建新迁移时,这两个字段的值都不同。
快速的解决方法,但不是最好的方法是始终使用相同的硬编码哈希和并发标记,但这确实是错误的。
使用自定义初始化逻辑会更好,这在这个问题中有很好的描述:How to seed an Admin user in EF Core 2.1.0?
推荐阅读
- elasticsearch - 当第一个字母拼写错误时,来自弹性搜索短语建议器的意外结果
- c# - 使用 glControl 而不是 Gamewindow。但是我怎样才能在另一个线程中自动渲染?
- react-native - RNFetchBlob 需要主队列设置
- python - 将单词与字典进行比较并赋值
- python - kivy 和 python3 在 ubuntu 18.04 上不起作用
- python - 打印组合列表会导致 MemoryError
- python - 使用 Python 通过 MAC 地址 Ping
- javascript - JavaScript:对数组中的整数和运算符进行排序
- django - Nginx 不提供我的 django 应用程序媒体文件
- android - 在没有 Jack 的情况下使用 Java 8 构建 Cordova Android