通过导航属性进行C#MVC EF访问会导致实体在db.SaveChanges()上抛出异常

时间:2012-10-03 00:36:32

标签: c# asp.net-mvc entity-framework

我有一个具有表单引用约束的实体:Entity-> Others并且我正在尝试删除相关实体。

加载后,实体被删除,然后保存回来,这样可以正常工作。

Entity entity = null;
entity = db.Entities.Where(o => o.Id == loadId).FirstOrDefault();

db.Entities.DeleteObject(entity);
db.SaveChanges();

通过引用约束向单个类型的实体添加单个检查会导致在保存时抛出异常

Entity entity = null;
entity = db.Entities.Where(o => o.Id == loadId).FirstOrDefault();

entity.Others.Count();

db.Entities.DeleteObject(entity);
db.SaveChanges();

除了:

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

我并没有期待太多,因为我这里没有完整的最小代码,但是对于如何简单地访问其他无效的实体以保存回来的最模糊的建议将非常受欢迎。

1 个答案:

答案 0 :(得分:0)

在您的映射中看起来有些错误。您首先使用数据库,并且您的数据库在EntityOrder之间允许级联删除,但您的EDMX模型没有,或者您的数据库允许存在Orders而没有Entity(可以为空的FK)但你的课程没有。

在第一种情况下,在EDMX中选择关联并修改其属性以在正确的方向上支持OnDelete。在后一种情况下,请确保EntityOrder之间的基数为0..1-N而不是1-N。如果您在Order中暴露了FK,请确保它可以为空。

没有级联删除或可空的FK,你的第一个例子应该抛出错误(除非你在数据库中关闭了你不应该做的约束验证)。在这种情况下,您必须首先删除每个依赖的所有依赖实体(Orders),然后才能删除主体(Entity)。