EF6数据播种问题与System.Data.Entity.Migrations.AddOrUpdate

时间:2018-12-14 22:41:46

标签: c# entity-framework-6 sql-server-2016

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)。

此外,数据库是最新的,并且应用程序在运行时不会引发任何数据访问错误,因此连接良好且模型处于同步状态。我们只是无法使种子方法按示例所示的方式工作。

1 个答案:

答案 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();
    }