2013-05-07 81 views
0

我有主表和细节表。例如主表是ObjectSet<'MasterObject>,详细信息表是ObjectSet<'DetailObject>。所以每个MasterObject包含EntityCollection<'DetailObject>。 据我所知,我可以从数据库中使用以下除去DetailObject使用EntityCollection.Remove删除项目()

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

null。这是正常的。但context.SaveChanges()给我以下异常:

“操作失败:的关系无法改变,因为 一个或多个外键的属性是不可为空当 变化的关系作出,相关的外键属性是 设置为空值如果外键不支持空值 必须定义一个新的关系外键属性必须是 指定另一个非空值或无关的对象必须被删除。“ ”。

我可以删除使用context.RemoveObject()这个DetailObject,但有可能做到这一点使用EntityCollection<>

回答

0

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

要么更改它,以便FK可以为空或重新设计您的数据库模式。

如果这是您需要支持的操作,也许您应该在引用主表的细节表中包含FK。所以,你可以删除详细信息行。

如果这没有帮助,请提供一个脚本,显示如何创建数据库表。

+0

我有以下的情况(...嗯非常相似): 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

+0

例如下面的代码工作正常: var deletingDetailObject = masterObject.DetailObjects.Single(s => s.id_detail_object == ...); context.DeleteObject(deletionDetailObject); 上下文。保存更改(); //罚款,没有例外 相同的表,同一个项目,相同的数据库...我很惊讶。 MasterTable和DetailTable之间的关系是从现有的数据库自动创建的。 – vchs 2013-05-07 13:36:35

+0

在我之前的代码示例中,EntityCollection <<'DetailObject >>。Remove(deletionDetailObject); deletionDetailObject.EntityState已更改为Modified。为什么不删除? MSDN表示:Remove(...)删除后,DeleteDetailObject将被标记为删除。 可能是错误的方式(我的意思是entitycollection.remove() - > context.savechanges())? 谢谢。 – vchs 2013-05-07 13:37:21