我从用户输入中收到 1) 项目列表和 2) 一个人的数据。订单表将包含指向项目和人员的链接。我需要创建链接每个项目和人员的订单记录。然而,我不能简单地创建一个人的记录并将所有项目与他关联起来。由于合规性要求,我需要创建重复的人员记录并将每个项目与单独但相同的人员记录相关联,例如,这就是我需要的: 我得到的物品:汽车、电视;人物:约翰.我需要将数据写入数据库并创建这样的订单(seq 字段是自动生成的 IDENTITY 列)
项目表
身份证姓名
1辆车
2 台电视
人桌
身份证姓名
1 约翰
2 约翰
订单表
id person_ref item_ref
1 1 1
2 2 2
Person 和 Items 对象来自用户输入。我应该只得到一个人和多件物品。下面是代码,Person、Item 和 Order 是表,它们通过外键 order->item、order->person
链接[BindProperty]
public Person Person { get; set; } = null!;
[BindProperty]
public List<Item> Items { get; set; } = null!;
using (var context = new Db())
{
foreach (Item item in Items)
{
Order o = new Order();
o.ItemRefNavigation = item;
o.PersonRefNavigation = Person;
context.Orders.Add(o);
context.SaveChanges();
}
}
但是,这会创建以下记录
项目表
身份证姓名
1辆车
2 台电视
人桌
身份证姓名
1 约翰
订单表
id person_ref item_ref
1 1 1
2 1 2
如果对于每一项,我手动创建新的人员并用人员数据填充它,我确实在人员表中获得了多条记录,但是,只有一个人员记录用于创建订单记录,它看起来像这样 项目表
身份证姓名
1辆车
2 台电视
人桌
身份证姓名
1 约翰
2 约翰
订单表
id person_ref item_ref
1 1 1
2 1 2
如何创建相同的个人记录并将其链接到每个项目?我是实体框架的新手。能否请你帮忙?谢谢
EF 使用引用,因此如果您引用同一个 Person 实例,它们将链接到同一行。如果您想要具有相同名称(Id #1 和 #2)的不同 Person,那么您需要确保使用新的 Person 实例创建订单:
using (var context = new Db())
{
foreach (Item item in Items)
{
Order o = new Order();
o.ItemRefNavigation = item;
o.PersonRefNavigation = new Person { name = Person.Name };
context.Orders.Add(o);
context.SaveChanges();
}
}
这应该为您提供 OrderId-Person-ItemId 的 1-1-1 和 2-2-2
这与大多数人在 EF 中遇到的问题相反,他们期望两个名为“John”的实例引用同一条记录,其中 EF 为每个实例创建两个单独的行。参考文献对 EF 来说意味着一切。
对于具有多个值的较大对象等,您可以使用映射器将完整复制到新实例中。