Как засеять основные данные структуры сущностей соответствующими данными - PullRequest
1 голос
/ 29 мая 2020

У меня есть эти два класса:

public class Item
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public Store Location { get; set; }
}

public class Store
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }
}

Я хочу добавить несколько примеров данных в свое ASP. NET Core Entity Framework Core WebAPI Code First приложение.

Итак Я видел, что могу использовать что-то вроде:

modelBuilder.Entity<Item>().HasData(new Item {<properties>});

Две проблемы:

  1. Если я не указываю значение для «ID», я получаю исключение, которое требуется.
  2. Если я укажу значение для Location, например new Store{<etc.>}, я получаю сообщение об ошибке, что не было указано значение для LocationID, который является столбцом в моей базе данных в таблице «Items», которая является внешним ключом, связывающим эту таблицу с таблицей «Магазины».

Как мне заполнить новый «элемент» в моей базе данных, если этот класс не имеет свойства «LocationID»? И должен ли я сначала специально добавить «Магазин» перед добавлением «Предмета»? Я надеялся, что будет какая-то автоматическая c каскадная вставка.

1 Ответ

1 голос
/ 29 мая 2020

По поводу ваших вопросов:

  1. Вы просто указываете Id, поскольку вы заполняете исходные данные
  2. Вы должны вставить Stores, нет такой вещи, как "каскадная вставка", что будет ли EF вставлять как имя в автоматически сгенерированные магазины?

Таким образом, вам также нужно заполнить свои магазины, как вы заполняете элементы:

modelBuilder.Entity<Store>().HasData(new Store {<properties>});

Что бы я также сделал, это чтобы измените свои модели следующим образом:

public class Item
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int StoreId { get; set; } //or LocationId  if you prefer

    [Required]
    public Store Location { get; set; }
}

public class Store
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual ICollection<Item> Items { get; set; }
}

, и вам необходимо установить это как внешний ключ для вашего объекта Location:

modelBuilder.Entity<Item>().HasOne(e => e.Location)
                .WithMany(e => e.Items)
                .HasForeignKey(e => e.StoreId)
                .OnDelete(DeleteBehavior.Restrict);

после этого вы можете просто настроить свой метод seed на:

modelBuilder.Entity<Item>().HasData(new Item { Id = 1, StoreId = 1 });

Обратите внимание, что нет необходимости создавать экземпляр объекта Location.

...