У меня есть два класса, созданные Entity Framework на основе таблиц в моей базе данных
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". Конфликт произошел в базе данных «Тест», таблице «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();
Я не хочу использовать каскадное удаление, как если бы этому определению атрибута было присвоено более одного значения атрибута, я хочу, чтобы ограничение выдало исключение, чтобы сказать, что его нельзя удалить.
Есть идеи?