实体框架4 - 插入多对多

时间:2011-11-01 21:42:22

标签: .net linq entity-framework-4

我是EF4的新手,我正试图从多对多关系中插入一条记录。我有3张桌子:

  • A(ID,说明)
  • B(ID,码)
  • AB(aID,bID)< - A和B关系

问题在于,当我调用SaveChanges()时,它会抛出一个异常并且它试图在B中插入一条新记录。我不想这样,它应该只是添加链接。这是我的代码:

var a = new A(){Description="Example"};

var b = context.B.Single(B => B.ID == paramID);

a.B.Add(b);

context.A.AddObject(a);

context.SaveChanges() <---- here it throws the exception

从我的研究中,上面的代码应该和A的新记录并在A和B之间创建一个链接并将其存储在AB表中,对吗?

我错过了什么?

编辑:

这是我得到的例外:

无法将值NULL插入“MIC”列,表'dbo.B';列不允许空值。 INSERT失败。\ r \ n语句已终止。

如果你注意到,我只是试图添加多对多链接而不是在表B中创建新记录。我甚至试图将aB留空,它仍然抛出上述异常。

1 个答案:

答案 0 :(得分:2)

在将A添加到集合之前,您可以尝试将B附加到上下文中:

var a = new A { Description = "Example" };
var b = context.B.Single(B => B.ID == paramID);

context.A.AddObject(a);
a.B.Add(b);

context.SaveChanges();

不幸的是我现在没有机会对此进行测试,但我的猜测是,在向上下文添加A时,EF会将B集合中对象的状态设置为{{ 1}}。在这种情况下,这应该解决问题。

或者您可以尝试反过来 - 将Added添加到A列表中:

B

在您的情况下,这看起来似乎更简洁。