Удаление объектов в правильном порядке с EF - PullRequest
3 голосов
/ 13 октября 2011

У меня есть два класса, созданные 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();

Я не хочу использовать каскадное удаление, как если бы этому определению атрибута было присвоено более одного значения атрибута, я хочу, чтобы ограничение выдало исключение, чтобы сказать, что его нельзя удалить.

Есть идеи?

1 Ответ

1 голос
/ 14 октября 2011

Так что это может быть особый случай, но я решил добавить ответ на тот случай, если люди будут заинтересованы или ищут его.

Как оказалось, EF не импортировала референтное ограничение из БД при обновлении модели. Я решил это, посмотрев под Ограничения в Браузере моделей. Это привело к тому, что он не знал порядок удаления сущностей при сохранении в базу данных.

Как только я разобрался с этим, из предыдущего опыта я понял, что если вы поместите некластеризованный индекс в первичный ключ, который используется в ограничении, EF будет шипеть и не импортировать его. Подробнее см. Здесь.

Итак, я просто отбросил индекс, снова импортировал ограничение, и теперь все работает как надо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...