【问题标题】:Using Entity Framework 4.1, how can I achive below requirement?使用 Entity Framework 4.1,我怎样才能达到以下要求?
【发布时间】:2012-06-05 12:13:00
【问题描述】:

考虑我有 2 个实体 - a) Publisher b) Book Publisher 具有称为 PublishedBooks 的导航属性,它是书籍的集合。 假设 Publisher1 已经出版了 2 本书,即 Book1 和 Book2 我想做的是,对于 Publisher1,删除已出版的书 Book1 和 在数据库中添加一本新出版的书(即 Book3)。

Context.SaveChanges() 抛出错误 -

操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当一个 对关系进行更改,相关的外键属性是 设置为空值。如果外键不支持空值, 必须定义一个新的关系,外键属性必须是 分配了另一个非空值,或者不相关的对象必须是 已删除。

注意:删除级联规则存在于数据库和上下文类中。 顺便说一句,我使用的是 C# 和 Sql Server 2005。

【问题讨论】:

  • // 我正在尝试从出版商的图书收藏中删除这本书 - Publiser1.Books.Remove(Publisher1.Books.First()); // 然后将新书添加到与 - 相同的集合中 - var newbook = new book(){}; Publisher1.Books.Add(newbook); Context.SaveChanges();
  • 谢谢,但请将代码添加到您的问题中。还要显示 Book 和 Publisher 类,以便其他人知道您当前是如何实现它的。因此,如果您在代码中有一些错误,他们可以纠正您;)
  • 肯定会创建一个 poc 并上传

标签: c# entity-framework


【解决方案1】:

听起来你正在做这样的事情:

Foo foo = entity.RelatedFoos.Where(f=>f.id=xyz);
entity.RelatedFoos.Remove(foo); //this is the problematic line
context.SaveChanges();

也就是说;您正在从一组相关项目中删除一个实体 - 而不是从上下文本身的主集合中删除。如错误中所述,删除上述方式只会删除关系。不是对象foo。这可能是你的意思,如果你的意思是删除foo

Foo foo = entity.RelatedFoos.Where(f=>f.id=xyz);
context.Foos.Remove(foo);
context.SaveChanges();

【讨论】:

  • 嗯,现在明白了。不要从实体中删除对象,而是从数据库中删除它。
【解决方案2】:

需要在保存前显式删除子对象,例如

Context.DeleteObject(Book1);
Context.SaveChanges();

【讨论】:

  • 我尚未测试您的建议,但似乎它会起作用。请参阅我的 cmets 以响应“hwcverwe”。这样您就可以更好地了解我要做什么。
  • 我明白了,我认为 DeleteObject 方法应该适用于您的场景。 Remove 会断开它,但它允许您可能想用它做其他事情,例如附加到另一个 Publisher。
猜你喜欢
  • 2019-10-04
  • 1970-01-01
  • 2018-09-21
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多