【问题标题】:Entity Framework 4 - Insert a many-to-manyEntity Framework 4 - 插入多对多
【发布时间】:2011-11-01 21:42:22
【问题描述】:

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

  • A(ID、描述)
  • B(ID,代码)
  • AB(aID,bID)

问题是,当我调用 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 留空,但它仍然会引发上述异常。

【问题讨论】:

  • 异常类型和消息似乎与这个问题有关...

标签: .net linq entity-framework-4


【解决方案1】:

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

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。在这种情况下,这应该可以解决问题。

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

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

b.A.Add(a);

context.SaveChanges();

在您的情况下,这似乎是一种更清洁的方法。

【讨论】:

  • 您可能想在尝试添加之前检查链接表中的记录是否已经存在...(即将 Single 更改为 SingleOrDefault,然后仅在 b 为 null 时添加...)
猜你喜欢
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 2018-06-24
  • 2011-06-26
  • 2013-01-12
相关资源
最近更新 更多