2011-11-01 130 views
2

我是EF4的新手,我试图从多对多关系中插入一条记录。我得到3个表:实体框架4 - 插入多对多

  • 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中创建一条新记录。我甚至试图让a.B留空,它仍然抛出上面描述的异常。

+2

异常类型和消息似乎与此问题有关... – driis

回答

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集合中的对象的状态设置为Added。在这种情况下,这应该可以解决问题。

您也可以试试轮走另一条路 - 添加AB名单:

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

b.A.Add(a); 

context.SaveChanges(); 

这似乎就像在你的情况下,更简洁的方法。

+0

最后的建议解决了一切! – Mauro

+0

在尝试添加...之前,您可能想要检查链接表中的记录是否已存在(即,将Single更改为SingleOrDefault,然后只在b为空时添加...) – AshesToAshes