EF 6.2, SQL Server 2016开发人员版 .Net 4.5.2
我在使用AddOrUpdate扩展方法时遇到了一些问题。 据我了解,该方法应该使用lambda表达式定义唯一字段,该唯一字段用于确定记录是否要更新或添加。但是我的似乎忽略了这一点,并试图每次添加。此示例使用Identity类AspNetRole,但是上下文中的所有实体都发生相同的问题。
public class UserSeeder
{
public static void Seed(MyIdentityDbContext context)
{
HashSet<AspNetRole> roles = new HashSet<AspNetRole>();
AspNetRole systemAdmin = new AspNetRole() { Id = "269E684F-9542-4F6A-8029-7516AA2ECD61", Name = "System Admin" };
AspNetRole admin = new AspNetRole() { Id = "BE70FDF9-FCD5-4894-AE71-DA324A7D751E", Name = "Administrator" };
AspNetRole normalUser = new AspNetRole() { Id = "D9C66DC0-190F-463A-88B0-8E1E4ED96BAF", Name = "User" };
roles.Add(systemAdmin);
roles.Add(admin);
roles.Add(normalUser);
foreach (AspNetRole role in roles)
{
context.Roles.AddOrUpdate(r =>r.Id, role);
//context.Roles.AddOrUpdate(role);
//both throw same error
}
context.SaveChanges();
}
}
以及在通过启用迁移生成的Configuration.cs文件中。
// This method will be called after migrating to the latest version.
protected override void Seed(MyIdentityDbContext context)
{
UserSeeder.Seed(context);
base.Seed(context);
}
这是我使用lambda进行调用并仅传入对象时遇到的错误。我怀疑有些配置没有正确设置,因为这在上周有效,当我检查git时,未对任何DAL项目的文件进行任何更改。
违反主键约束'PK_dbo.AspNetRoles'。无法在对象'dbo.AspNetRoles'中插入重复的密钥。重复的键值为(269E684F-9542-4F6A-8029-7516AA2ECD61)。
此外,数据库是最新的,并且应用程序在运行时不会引发任何数据访问错误,因此连接良好且模型处于同步状态。我们只是无法使种子方法按示例所示的方式工作。
答案 0 :(得分:0)
您可以检查角色是否已经存在(如果存在),然后更新或添加新角色
public static void Seed(MyIdentityDbContext context)
{
HashSet<AspNetRole> roles = new HashSet<AspNetRole>();
AspNetRole systemAdmin = new AspNetRole() { Id = "269E684F-9542-4F6A-8029-7516AA2ECD61", Name = "System Admin" };
AspNetRole admin = new AspNetRole() { Id = "BE70FDF9-FCD5-4894-AE71-DA324A7D751E", Name = "Administrator" };
AspNetRole normalUser = new AspNetRole() { Id = "D9C66DC0-190F-463A-88B0-8E1E4ED96BAF", Name = "User" };
roles.Add(systemAdmin);
roles.Add(admin);
roles.Add(normalUser);
foreach (AspNetRole role in roles)
{
AspNetRole dbrole = context.Roles.FirstOrDefault(r => r.Id.ToLower() == role.Id.ToLower());
if (dbrole != null)
{
dbrole.Name = role.Name;
context.Roles.AddOrUpdate(dbrole);
}
else
{
context.Roles.Add(role);
}
}
context.SaveChanges();
}