EF: не могу удалить зависимые таблицы одним скопом
От: Kingofastellarwar Украина  
Дата: 11.09.09 20:50
Оценка:
Есть простенькая база, OR/M — Entity Framework



Нужно: нажатием на кнопку очистить таблицы User, Access, Sheet, Staff

Если вызвать последовательно удаления во всех этих таблицах и завершить их SaveChanges
foreach(Sheet sheet in DAL.Sheet)
{
    DAL.DeleteObject(sheet);
}

foreach(Access access in DAL.Access)
{
    DAL.DeleteObject(access);
}

foreach(User user in DAL.User)
{
    DAL.DeleteObject(user);
}

foreach(Staff staff in DAL.Staff)
{
    DAL.DeleteObject(staff);
}
DAL.SaveChanges();

то получим такую ошибку:
An unhandled exception of type 'System.Data.UpdateException' occurred in System.Data.Entity.dll
Additional information: Entities in 'Sheet' participate in the 'FK_Sheet_Staff' relationship. 0 related 'Staff' were found. 1 'Staff' is expected.


Но! Если не трогать Staff, а очистить только User, Sheet, Access, то всё пройдёт хорошо, и если потом перезапустить приложние, то и Staff тоже следом удалится без проблем.
// при первом запске выполняем три этих цикла
foreach(Sheet sheet in DAL.Sheet)
{
    DAL.DeleteObject(sheet);
}

foreach(Access access in DAL.Access)
{
    DAL.DeleteObject(access);
}

foreach(User user in DAL.User)
{
    DAL.DeleteObject(user);
}
DAL.SaveChanges();

// а это - после перезагрузки
foreach(Staff staff in DAL.Staff)
{
    DAL.DeleteObject(staff);
}        
DAL.SaveChanges();


В тоже время вот такой вариант не работает
// всё без перезагрузок
foreach(Sheet sheet in DAL.Sheet)
{
    DAL.DeleteObject(sheet);
}

foreach(Access access in DAL.Access)
{
    DAL.DeleteObject(access);
}

foreach(User user in DAL.User)
{
    DAL.DeleteObject(user);
}
DAL.SaveChanges();

foreach(Staff staff in DAL.Staff)
{
    DAL.DeleteObject(staff);
}

DAL.SaveChanges();


Короче: не получается удалить энтити, которые ссылаются на уже удалённые энтити в одном scope.
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.