使用EF以正确的顺序删除对象

时间:2011-10-13 00:46:24

标签: .net sql asp.net-mvc entity-framework

我有两个基于实体框架的类,基于我的db

中的表
public class AttributeDefinition
{
    int id { get; set; }
    string Type { get; set; }
    string Description { get; set; }
    EntityCollection<AttributeValue> AttributeValues { get; set; }
}

public class AttributeValue
{
    int id { get; set; }
    string Value { get; set; }
    AttributeDefinition AttributeDefinition { get; set; }
}

在数据库中,关系由AttributeDefinitionID表中的外键列AttributeValue指定。

我要删除的情况如下:

if (definition.AttributeValues.Count == 1)
    _db.AttributeValues.DeleteObject(definition.AttributeValues.First());
/*
else if (definition.AttributeValues.Count == 0)
    nothing needs to be done
else if (definition.AttributeValues.Count > 1)
    allow delete of AttributeDefinition, constraint will throw error on save
    which is caught and handled to output error
*/

_db.AttributeDefinitions.DeleteObject(definition);
_db.SaveChanges();

我认为这应该有效,但是它似乎首先尝试删除AttributeDefinition,所以我得到了一个引用约束错误:

  

DELETE语句与REFERENCE约束“FKAttributeV644147”冲突。冲突发生在数据库“Test”,表“dbo.AttributeValue”,列'AttributeDefinitionID'中。   声明已经终止。

如果我在删除之间保存,它可以正常工作:

if (definition.AttributeValues.Count == 1)
{
    _db.AttributeValues.DeleteObject(definition.AttributeValues.First());
    _db.SaveChanges();  //Save between deletes
}

_db.AttributeDefinitions.DeleteObject(definition);
_db.SaveChanges();

我不想使用级联删除,就好像为此属性定义分配了多个属性值一样,我希望约束引发一个异常,说明不能删除它。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

所以这可能是一个特例,但我想我会添加答案,以防人们感兴趣或正在寻找它。

事实证明,在更新模型时,EF没有从DB导入参照约束。我通过在模型浏览器中查看 Constraints 来解决这个问题。这导致它在保存到数据库时不知道删除实体的顺序。

一旦我解决了这个问题,我从之前的经验中知道,如果你在约束中使用的主键上放置一个非聚集索引,那么EF有一个合适的东西并且不会导入它。 See here for details.

所以我简单地删除了索引,重新导入了约束,现在一切正常。