Linq Logical Удалить с ассоциациями - PullRequest
0 голосов
/ 29 января 2010

Я пытаюсь реализовать логическое удаление senario для всех моих сущностей. Все они имеют логическое свойство IsDeleted. Я также хотел бы каскадное удаление ассоциаций также. Я начал с добавления частичного метода для сущности в текстовый текст данных.

partial void DeleteQuestion(Question instance)
{
    instance.IsDeleted = true;
    ExecuteDynamicUpdate(instance);
    foreach (var answer in instance.Answers)
    {
       DeleteAnswer(answer);
    }
}

Это приводит к ошибке Incorrect syntax near the keyword 'WHERE' в ExecuteDynamicUpdate. Глядя на sql profiler, я вижу, что предложение set пустое, оно не записывает IsDeleted = true; как изменение. Я проверил событие IsDeletedChanging, и оно срабатывает, но я думаю, что набор изменений уже создан к этому времени.

Я также попытался отправить изменения вместо вызова ExecuteDynamicUpdate, но это выдает исключение The operation cannot be performed during a call to SubmitChanges.

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

Итак, я подумал, давайте спросим SO-сообщество и получим правильный ответ на вершину результатов Google. Похоже, на эту тему мало.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 30 января 2010

Вам действительно нужно сохранить удаленное состояние во всей иерархии содержимого?

Скажем, у вас есть вопрос "Q" и ответы "А" и "Б". В какой-то момент вы благополучно удалите «А». (Состояние 1) «Q имеет B».

Теперь вы можете удалить «Q», ожидая, что когда вы восстановите «Q», вы получите (состояние 1). Но safedelete установил «B» в удаленное состояние, а «undelete» установил все дочерние элементы «Q» в неустановленное состояние, тогда вы получите «Q имеет A, B». Операции safedelete и undelete уничтожили состояние дочерних элементов коллекции.

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

Я бы рекомендовал использовать «неразборчивое редактирование», что подразумевает вывод состояния IsDeleted из иерархии содержимого. Если родитель IsDeleted, это означает, что дочерний элемент также считается удаленным.

0 голосов
/ 29 января 2010

Похоже, вы вызываете DeleteQuestion прямо в своем коде. Вы не должны делать это. Этот частичный метод вызывается в результате действия Delete. Поэтому экземпляр, передаваемый в вашем частичном методе, уже предназначен для Delete, поэтому этот метод вызывается Linq для SQL. Похоже, вы сами вызываете этот метод, а затем пытаетесь удалить экземпляр, переданный в качестве параметра. Это не то, что вы хотите сделать.

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