【问题标题】:Delete Item from DB using EntityCollection.Remove()使用 EntityCollection.Remove() 从数据库中删除项目
【发布时间】:2013-05-07 12:25:56
【问题描述】:

我有主表和详细表。例如主表是ObjectSet<'MasterObject>,明细表是ObjectSet<'DetailObject>。所以每个MasterObject 都包含EntityCollection<'DetailObject>。 据我了解,我可以使用以下方法从数据库中删除 DetailObject

  1. EntityCollection<'DetailObject> ec = masterObject.DetailObjects; // 作为导航属性
  2. ec.Remove(deleting_detail_object); // 删除detail_object 将被删除并标记为删除。
  3. context.SaveChanges(); // 我有异常

Remove() 之后,deleting_detail_object.MasterObject(导航属性)是null。这是正常的。但是context.SaveChanges() 给我以下异常:

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

我可以使用context.RemoveObject() 删除这个DetailObject,但是可以使用EntityCollection<> 来删除吗?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    我认为这个问题与 EntityCollection 无关,我认为您的数据库架构有问题。 如果您的主表具有不可为空的详细信息的 FK,则您无法删除详细信息表行,因为这会违反您的数据库架构。

    要么更改它以使 FK 可以为空,要么重新设计您的数据库架构。

    如果这是您需要支持的操作,也许您的详细信息表中应该有一个 FK 引用您的主表。因此,您可以删除详细信息行。

    如果这没有帮助,请提供一个脚本来说明您如何创建数据库表。

    【讨论】:

    • 我有以下情况(...嗯很相似): MasterTable: id_master_object (int primarykey) master_object_name (nvarchar ...) DetailTable: id_detail_object (int primarykey) id_master_object (外键到MasterTable) id_color (ColorsTable 的外键) 两个有关系的规范化表......非常简单和标准的情况。
    • 例如以下代码可以正常工作: var deletedDetailObject = masterObject.DetailObjects.Single(s=>s.id_detail_object == ...); context.DeleteObject(deletingDetailObject); context.SaveChanges(); //很好,无一例外相同的表,相同的项目,相同的数据库......我很惊讶。 MasterTable 和 DetailTable 之间的关系是从现有数据库自动创建的。
    • 在我之前的代码示例中,EntityCollection>.Remove(deletingDetailObject);删除DetailObject.EntityState 已更改为已修改。为什么不删除? MSDN 说:Remove(...) 之后,deletingDetailObject 会被标记为删除。可能是错误的方式(我的意思是 entitycollection.remove()->context.savechanges())?谢谢。
    • 请更新您的原始帖子,并使用代码格式。还为您的表提供创建脚本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2021-05-15
    • 2018-11-19
    相关资源
    最近更新 更多