У меня есть приложение, которое использует EF POCO для доступа к данным. Все отлично работает, но есть одна проблема с модульным тестированием. Представьте себе два связанных класса:
public class Brother
{
public virtual Sister Sister { get; set; }
}
public class Sister
{
public virtual ICollection<Brother> Brothers { get; set; }
}
Проблема здесь заключается в том, что если у нас есть экземпляр Brother со связанной сущностью, установленной на какую-то другую сущность, то ObjectContext.DeleteObject () выбрасывает общую ТОЛЬКО «коллекцию было изменено» в проекте модульного тестирования (модульное тестирование выполняется встроенная структура VS). Проблема does not
возникает в самом проекте. Пример кода, который не работает:
public void TheTestThatFails()
{
Brother bro = MyContextInst.CreateObject<Brother>();
Sister sis = MyContextInst.CreateObject<Sister>();
sis.Brothers.Add(bro);
MyContextInst.AddToBrothers(bro);
MyContextInst.AddToSisters(sis);
MyContextInst.SaveChanges();
// The following will throw a "Collection was modified" ex
MyContextInst.DeleteObject(sis);
// Yet if we disconnect the object graph everything is fine
// The following will work fine:
bro.Sister = null;
MyContextInst.DeleteObject(sis);
}
Откуда это? Насколько я могу судить, среда точно такая же (я пришел к созданию модульных тестов, и проект использует одну и ту же БД, одного и того же пользователя, все то же самое).
Почему EF не может обрабатывать граф объектов в проекте модульного теста? Почему он терпит неудачу только в модульном тестировании? .. Я полностью озадачен.
- Обратите внимание, что в коде пользователя нет упоминаний о коллекциях - исключение должно исходить из кода EF? ..
РЕДАКТИРОВАТЬ: после расследования:
* это происходит, если в коллекции хотя бы 1-много (отредактировано код)
* кажется, что более безопасный способ каскадного удаления состоит в том, чтобы сначала удалить дочерние объекты (Brothers), а затем очистить коллекцию родительского (Sister) и только после этого удалить ее из контекста, поскольку внутри самого EF есть что-то, что пытается соединить сущности и удаляет вещи из чего-то еще. Вопрос решен для меня на данный момент.