Как заполнить основные данные во время метода OnModelCreating DbContext, если включен автоматически сгенерированный первичный ключ?

Платформа приложения: ASPNET Core 2.1

это мой класс

public class Employee
{
    [DataMember(Name = "key")]
    [Key]
    public Guid Key { get; set; }
    [Required]
    [DataMember(Name = "Name")]
    public string Name { get; set; }
}

У меня есть код ниже, который позволяет заполнять данные и автоматически генерировать столбец Guid

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //Auto generation of Guid
        modelBuilder.Entity<Employee>().Property(x => x.Key).HasDefaultValueSql("NEWID()");

        //seeding of data
        modelBuilder.Entity<Employee>().HasData(
            new Employee{ Name = "Hamlet" },
            new Employee{ Name = "King Lear" },
            new Employee{ Name = "Othello" }
        );
    }

Я получаю следующую ошибку при выполнении команды add-migration InitialCreate

Исходный объект для типа объекта "Сотрудник" не может быть добавлен, так как не было предоставлено значение для требуемого свойства "Ключ".

Я не хочу отправлять значение для Key. Я хочу, чтобы он автоматически генерировался в базе данных SQL Server.

Мое основное требование: вставлять основные данные (обновленные) всякий раз, когда я запускаю update-database в консоли диспетчера пакетов.


person kudlatiger    schedule 24.11.2018    source источник
comment
Пока метод HasData не имеет перегрузки, которая принимает совпадающую спецификацию ключа, как это имеет AddOrUpdate. Это может быть запрос функции. До тех пор ваш единственный вариант — указать значение ключа. Однако обратите внимание, что вам всегда понадобится указанный ключ, если вы также хотите заполнить данные, относящиеся к Employee.   -  person Gert Arnold    schedule 24.11.2018


Ответы (1)


Попробуйте добавить следующий атрибут к свойству Key:.

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

Это укажет БД автоматически сгенерировать Key, если ничего не указано

Обновлять

Видимо вам нужно всегда указывать идентификатор даже для автоматически сгенерированных данных заполняется в миграциях, потому что он используется для сопоставления, если данная запись уже присутствует в базе данных.

Однако решение может состоять в том, чтобы вручную вставить необходимые записи в базу данных после ее инициализации (например, после вызова context.Database.Migrate()). Конечно, здесь вам нужно вручную проверить, не существует ли уже данная запись.

person Martin Zikmund    schedule 24.11.2018
comment
не работает. он показывает ту же ошибку, у меня уже есть modelBuilder.Entity‹Employee›().Property(x =› x.Key).HasDefaultValueSql(NEWID()); для автогенерации. «add-migration» работает, если я удаляю код начальных данных. так каков альтернативный вариант начальных данных? - person kudlatiger; 24.11.2018
comment
Это решило проблему, но не решило потребность. Он вставляет ключ, который я указал, как вы предложили. Я хочу видеть автоматически сгенерированные гиды в базе данных. - person kudlatiger; 24.11.2018
comment
Если вы объедините обновленную часть моего вопроса, а также атрибут [DatabaseGenerated(Identity)], он должен работать - person Martin Zikmund; 24.11.2018