По поводу ваших вопросов:
- Вы просто указываете Id, поскольку вы заполняете исходные данные
- Вы должны вставить 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.