实体框架中间表 - 使用现有的无关ID插入新记录?

时间:2014-06-19 16:27:13

标签: c# .net entity-framework

所以我有两个表,A和B.每个表都设置如下:

A: ItemAId, ItemAProperty1, ItemAProperty2, etc.
B: ItemBId, ItemBProperty1, ItemBProperty2, etc.

我在表A中有记录,在表B中有记录。这些记录彼此没有任何关系。

我有第三张桌子,C设置如下:

C: ItemAId, ItemBId

我想从表A和B中的现有记录在表C中创建一条新记录。使用intellisense不能使用C语言。在我看过的每个地方,建议是从A已经存在的对象构建一个对象,从B已经存在的对象,将B添加到A(反之亦然),然后执行添加...并且因为对象已经存在于数据库中,EF只会进行更新并将对象链接在中间表中。 (来自Insert/Update Many to Many Entity Framework . How do I do it?)I.E。:

/**** 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吗?

1 个答案:

答案 0 :(得分:0)

所以,正如我从挖掘更多的东西中发现的......

尽管ItemA和ItemB之间没有直接关系,但似乎存在包含主ID的链接表的事实导致ItemB对象内的ItemA的ICollection,反之亦然。因此,为了让它工作,我真正需要做的就是获得我想要链接的两个对象,将一个对象添加到另一个对象的集合中,并进行添加。实际(模仿)代码如何工作:

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();
}

当然,如果已经验证了对象的存在,则第一个()将起作用,并且" item1.ItemBs.Add()"有" ItemBs"因为EF很容易让一切变得多元化。