使用EntityCollection.Remove删除项目()
问题描述:
我有主表和细节表。例如主表是ObjectSet<'MasterObject>
,详细信息表是ObjectSet<'DetailObject>
。所以每个MasterObject
包含EntityCollection<'DetailObject>
。 据我所知,我可以从数据库中使用以下除去DetailObject
:使用EntityCollection.Remove删除项目()
-
EntityCollection<'DetailObject> ec = masterObject.DetailObjects;
//作为导航属性 -
ec.Remove(deleting_detail_object);
// deleting_detail_object将被删除,标记为删除。 -
context.SaveChanges();
//我有例外Remove()
的deleting_detail_object.MasterObject
(导航属性)
后null
。这是正常的。但context.SaveChanges()
给我以下异常:
“操作失败:的关系无法改变,因为 一个或多个外键的属性是不可为空当 变化的关系作出,相关的外键属性是 设置为空值如果外键不支持空值 必须定义一个新的关系外键属性必须是 指定另一个非空值或无关的对象必须被删除。“ ”。
我可以删除使用context.RemoveObject()
这个DetailObject
,但有可能做到这一点使用EntityCollection<>
?
答
我不认为这个问题与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的外键) 两个规范化的表与关系...非常简单和标准的情况。 – vchs 2013-05-07 13:35:59
例如下面的代码工作正常: var deletingDetailObject = masterObject.DetailObjects.Single(s => s.id_detail_object == ...); context.DeleteObject(deletionDetailObject); 上下文。保存更改(); //罚款,没有例外 相同的表,同一个项目,相同的数据库...我很惊讶。 MasterTable和DetailTable之间的关系是从现有的数据库自动创建的。 – vchs 2013-05-07 13:36:35
在我之前的代码示例中,EntityCollection >。Remove(deletionDetailObject); deletionDetailObject.EntityState已更改为Modified。为什么不删除? MSDN表示:Remove(...)删除后,DeleteDetailObject将被标记为删除。 可能是错误的方式(我的意思是entitycollection.remove() - > context.savechanges())? 谢谢。 – vchs 2013-05-07 13:37:21