EF6 Проблема заполнения данных с System.Data.Entity.Migrations.AddOrUpdate - PullRequest
0 голосов
/ 15 декабря 2018

EF 6.2, SQL Server 2016 Developer Edition, .Net 4.5.2

У меня возникают некоторые проблемы с методом расширения AddOrUpdate .Как я понимаю, метод должен определять с помощью лямбда-выражения уникальное поле, которое следует использовать для определения необходимости обновления или добавления записи.Но мой, кажется, игнорирует это и пытается добавлять каждый раз.В этом примере используется класс 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, сгенерированном с помощью Enabling Migrations.

//  This method will be called after migrating to the latest version.
protected override void Seed(MyIdentityDbContext context)
{
    UserSeeder.Seed(context);
    base.Seed(context);
}

Это ошибка, которую я получаю как для вызова с использованием лямбды, так и просто передачиобъект.У меня есть подозрение, что есть какая-то конфигурация, которую я не настраиваю правильно, потому что она работала на прошлой неделе, и когда я проверял git, не было внесено никаких изменений ни в один из файлов проекта DAL.

Нарушение ограничения PRIMARY KEY 'PK_dbo.AspNetRoles'.Невозможно вставить дубликат ключа в объект 'dbo.AspNetRoles'.Значение ключа-дубликата: (269E684F-9542-4F6A-8029-7516AA2ECD61).

Кроме того, база данных обновлена, и приложение не выдает никаких ошибок доступа к данным во время выполнения, поэтомусоединение в порядке, и модель синхронизирована.Мы просто не можем заставить метод seed работать так, как показывают примеры.

1 Ответ

0 голосов
/ 15 декабря 2018

Вы можете проверить, если роль уже существует, если существует, обновить, иначе добавьте новую роль

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