Есть простенькая база, 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 г.