gpt4 book ai didi

entity-framework - 如何在 Entity Framework 迁移中使用多对五关系播种数据

转载 作者:行者123 更新时间:2023-12-03 13:19:00 25 4
gpt4 key购买 nike

我使用 Entity Framework 迁移(在自动迁移模式下)。一切都很好,但我有一个问题:

当我有多对多关系时,我应该如何播种数据?

例如,我有两个模型类:

public class Parcel
{
public int Id { get; set; }
public string Description { get; set; }
public double Weight { get; set; }
public virtual ICollection<BuyingItem> Items { get; set; }
}

public class BuyingItem
{
public int Id { get; set; }
public decimal Price { get; set; }
public virtual ICollection<Parcel> Parcels { get; set; }
}

我了解如何播种简单数据(用于 PaymentSystem 类)和一对多关系,但是我应该在 Seed 中编写什么代码?生成 Parcel 的一些实例的方法和 BuyingItem ?我的意思是使用 DbContext.AddOrUpdate() , 因为我不想每次运行时都复制数据 Update-Database .
protected override void Seed(ParcelDbContext context)
{
context.AddOrUpdate(ps => ps.Id,
new PaymentSystem { Id = 1, Name = "Visa" },
new PaymentSystem { Id = 2, Name = "PayPal" },
new PaymentSystem { Id = 3, Name = "Cash" });
}
protected override void Seed(Context context)
{
base.Seed(context);

// This will create Parcel, BuyingItems and relations only once
context.AddOrUpdate(new Parcel()
{
Id = 1,
Description = "Test",
Items = new List<BuyingItem>
{
new BuyingItem() { Id = 1, Price = 10M },
new BuyingItem() { Id = 2, Price = 20M }
}
});

context.SaveChanges();
}

此代码创建 Parcel , BuyingItems和他们的关系,但如果我需要相同的 BuyingItem在另一个 Parcel (他们有一个多对多的关系),我对第二个包裹重复这个代码 - 它会重复 BuyingItems在数据库中(尽管我设置了相同的 Id s)。

例子:
protected override void Seed(Context context)
{
base.Seed(context);

context.AddOrUpdate(new Parcel()
{
Id = 1,
Description = "Test",
Items = new List<BuyingItem>
{
new BuyingItem() { Id = 1, Price = 10M },
new BuyingItem() { Id = 2, Price = 20M }
}
});

context.AddOrUpdate(new Parcel()
{
Id = 2,
Description = "Test2",
Items = new List<BuyingItem>
{
new BuyingItem() { Id = 1, Price = 10M },
new BuyingItem() { Id = 2, Price = 20M }
}
});

context.SaveChanges();
}

如何添加相同的 BuyingItem在不同的 Parcel年代?

最佳答案

您必须以与在任何 EF 代码中构建多对多关系相同的方式填充多对多关系:

protected override void Seed(Context context)
{
base.Seed(context);

// This will create Parcel, BuyingItems and relations only once
context.AddOrUpdate(new Parcel()
{
Id = 1,
Description = "Test",
Items = new List<BuyingItem>
{
new BuyingItem() { Id = 1, Price = 10M },
new BuyingItem() { Id = 2, Price = 20M }
}
});

context.SaveChanges();
}

指定 Id将在数据库中使用是至关重要的,否则每个 Update-Database将创建新记录。
AddOrUpdate不支持以任何方式更改关系,因此您不能使用它在下次迁移中添加或删除关系。如果您需要它,您必须通过加载 Parcel 手动删除关系与 BuyingItems并调用 RemoveAdd在导航集合上打破或添加新关系。

关于entity-framework - 如何在 Entity Framework 迁移中使用多对五关系播种数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8550756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com