繁体   English   中英

如何用相关数据播种实体框架核心数据

[英]How to seed entity framework core data with related data

我有这两个类:

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. 如果我像new Store{<etc.>}这样为 Location 提供一个值,我会收到一个错误,即没有为LocationID提供任何值,这是我的数据库中表“Items”中的列,它是将该表与表“链接”的外键商店”。

当 class 没有“LocationID”属性时,如何在我的数据库中播种新的“项目”? 在添加“项目”之前,我必须先专门添加一个“商店”吗? 我希望会有某种自动级联插入。

关于您的问题:

  1. 您只需提供 Id,因为您正在播种初始数据
  2. 您必须插入商店,没有“级联插入”之类的东西,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; }
}

并且您需要将此设置为您的位置 object 的外键:

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

之后,您可以将种子方法调整为:

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

请注意,无需实例化位置 object。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM