2017-01-31 2 views
0

У меня возникла проблема, при которой удаление записи в таблице работает, но только до тех пор, пока в таблице нет дочерних внешних ключей. Теперь, когда у нас есть родительская таблица и вы хотите удалить запись с помощью EF, она терпит неудачу с ошибкой «Связь не может быть изменена, потому что одно или несколько свойств внешнего ключа не могут быть обнулены». Я удалил каскадное удаление в дочерней таблице, ссылающейся на родительскую таблицу. Я тестировал его в SSMS. Он работает нормально. Но изнутри C# это терпит неудачу. У нас есть модель представления, где мы определили общий метод DeleteRow. Это отлично работает, пока удаляемая строка не имеет дочерних таблиц. Он терпит неудачу, если таблица является родительской таблицей. Я попробовал посмотреть здесь на Stackoverflow для ответа и наткнулся на этот вопрос, который теперь закрыт: stackoverflow.com/questions/17723276/delete-a-single-record-from-entity-framework. Ответ на этот вопрос использовал дискретную таблицу в EF. Мы используем дженерики. Вот наш код:Как удалить одну запись из EF, когда вы используете дженерики?

public void DeleteRow(T row) 
{ 
    if (App.MainDataContext != null && row != null) 
    { 
     App.MainDataContext.Entry<T>(row).State = EntityState.Deleted; 
     App.MainDataContext.SaveChanges(); 
    } 
} 

Я не верю, что установление государственной собственности перечислению EntityState.Deleted работает, как это только установить его для записи в родительской таблице, а не для какой-либо из соответствующих записей в дочерние таблицы. (MainDataContext - это объект из файла .EDMX.) Как мы удаляем одну запись из любой таблицы с помощью EF 6, когда мы используем generics для передачи в типе таблицы?

+0

Как насчет [этого] (http://stackoverflow.com/questions/41858097/entity-framework-hard-cascade-delete/41859633#41859633)? На самом деле я вижу, что это то же самое, что и ссылка. Все, что вам нужно, это перевести его, например: 'App.MainDataContext.Set () .Attach (строка); App.MainDataContext.Set () .Remove (row); ' –

ответ

0

Проблема заключается в том, что при установке состояния для удаления связанный объект также загружается (отслеживается отслеживателем изменений контекста). Когда вы удаляете свою строку, EF пытается установить свойство родительской навигации равным null, но это отношение не равно NULL.

Чтобы решить эту проблему, вы должны установить каскадное удаление в отношениях в вашей модели (EDMX) не только в базе данных.

Он также должен работать, если по экземпляру вашего контекста связанная сущность не отслеживается. В этом случае на стороне SQL-Server должно работать каскадное удаление.

+0

Интересно и для меня неожиданно. Каскадное удаление определяется в базе данных. Я попал в модель EF (файл .edmx) в конструкторе и обновил объекты там, основываясь на базе данных. Я думал, что это перенесено в модель EF. То, что вы говорите, подсказывает мне, что это не так, что меня удивляет. – Rod

+0

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

+0

Я просто попытался установить свойство «End1 OnDelete» в Cascade (это было None, как вы и предполагали) в ассоциации. А также сделал то же самое с другой дочерней таблицей, которая находится в аналогичной связи с родительской таблицей. Затем я скомпилировал его. Теперь у меня есть 156 ошибок вместо 0. Ошибки, подобные VS, не могут найти таблицы, которые находятся в диаграмме .edmx. Я предполагаю, что я сделал неправильное дело, пытаясь установить каскадные удаления в диаграмме .edmx. Где я должен это делать? – Rod

Смежные вопросы