我有两个基于实体框架的类,基于我的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();
我不想使用级联删除,就好像为此属性定义分配了多个属性值一样,我希望约束引发一个异常,说明不能删除它。
有什么想法吗?
答案 0 :(得分:1)
所以这可能是一个特例,但我想我会添加答案,以防人们感兴趣或正在寻找它。
事实证明,在更新模型时,EF没有从DB导入参照约束。我通过在模型浏览器中查看 Constraints 来解决这个问题。这导致它在保存到数据库时不知道删除实体的顺序。
一旦我解决了这个问题,我从之前的经验中知道,如果你在约束中使用的主键上放置一个非聚集索引,那么EF有一个合适的东西并且不会导入它。 See here for details.
所以我简单地删除了索引,重新导入了约束,现在一切正常。