У меня есть приложение, которое использует EF POCO для доступа к данным. Все работает отлично, но есть одна проблема с модульным тестированием. Представьте себе два связанных класса:Entity Framework (POCO) + Unit Testing = Collection было изменено исключение
public class Brother
{
public virtual Sister Sister { get; set; }
}
public class Sister
{
public virtual ICollection<Brother> Brothers { get; set; }
}
Проблема здесь состоит в том, что если у нас есть экземпляр Brother с соответствующей организацией, установленной в какой-то другой организации, то ObjectContext.DeleteObject() бросает общий «Colletion был изменен» ТОЛЬКО в единичный тестовый проект (модульное тестирование выполняется с помощью встроенной схемы 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 ..
EDIT: После исследования: * это происходит, если коллекция, по крайней мере 1-много (отредактированный код) * кажется, что более безопасным способом каскадного удаления было бы сначала удалить дочерние объекты (Братья), затем очистить коллекцию родителя (Sister) и только после этого удалить его из контекст, поскольку внутри самого EF есть что-то, что пытается подключить сущности и удаляет материал из чего-то другого. На данный момент вопрос решен для меня.
ознакомьтесь с этой статьей: http://oddiandeveloper.blogspot.com/2009/01/linq-to-entities-and-collection-was.html – RPM1984
Обратите внимание, что последнее примечание в вопросе - нет пользовательского кода упоминание коллекций. – Jefim
Этот код может не соответствовать вашим фактическим модульным тестам, но если вам нужно подумать о том, чего вы пытаетесь достичь в этих тестах. Поскольку этот код стоит, вы проверяете только EF, который не является вашей ответственностью, MS уже это сделала. –