实体框架中间表-使用现有的不相关id插入新记录
本文关键字:不相关 id 新记录 插入 中间 框架 实体 | 更新日期: 2023-09-27 18:09:17
我有两个表A和b,每个表是这样设置的:
A: ItemAId, ItemAProperty1, ItemAProperty2, etc.
B: ItemBId, ItemBProperty1, ItemBProperty2, etc.
我在表a中有一条记录,在表b中有一条记录。这些记录彼此之间没有任何关系。
我有第三张表,C设置如下:
C: ItemAId, ItemBId
我想从表a和表b中的现有记录在表C中创建一个新记录。我所看到的任何地方,建议都是根据已经存在的A和已经存在的B创建一个对象,将B添加到A(反之亦然),然后进行添加……因为这些对象已经存在于数据库中,EF将只做一个更新,并在中间表中将这些对象链接在一起。(从插入/更新多对多实体框架。我该怎么做?)例如:
/**** Rough Psuedocode ****/
var a = context.First(a => a.Id == passedInAId);
var b = context.First(b => b.Id == passedInBId);
a.BProperty.Add(b);
context.Add(a);
context.SaveChanges()
但是,在这种情况下,对象没有关联它们的属性,所以这不起作用。
我知道我可以写一个存储过程来做到这一点,但是有可能用EF吗?
所以,正如我在进一步挖掘中发现的…
尽管ItemA和ItemB彼此之间没有直接关系,但由于存在一个包含主id的链接表,因此在ItemB对象中产生了ItemA的iccollection,反之亦然。因此,要使它工作,实际上我所需要做的就是,获得我想要链接的两个对象,将其中一个添加到另一个所述对象的集合中,并执行添加操作。它如何工作的实际(模仿)代码是:
using ( var ctx = new Model())
{
var item1 = ctx.ItemA.FirstOrDefault(i => i.Id == itemAId);
var item2 = ctx.ItemB.FirstOrDefault(j => j.Id == itemBId);
item1.ItemBs.Add(item2);
ctx.SaveChanges();
}
当然,如果已经验证了对象的存在,那么First()就可以工作,并且"item1. itemb . add()"具有" itemb ",因为EF有将EVERYTHING复数化的烦人倾向。