Entity Framework (POCO) + Unit Testing = Коллекция была изменена исключительная ситуация - PullRequest
1 голос
/ 06 октября 2010

У меня есть приложение, которое использует 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 есть что-то, что пытается соединить сущности и удаляет вещи из чего-то еще. Вопрос решен для меня на данный момент.

Ответы [ 2 ]

0 голосов
/ 24 октября 2011

После исследования: * это происходит, если коллекция не меньше 1 (много) (редактируется код) * кажется, что более безопасный способ каскадного удаления - сначала удалить дочерние объекты (братья), а затем очистить коллекцию родительского (Sister) и только после этого удаляйте его из контекста, так как внутри самого EF есть что-то, что пытается соединить сущности и удаляет вещи из чего-то еще. Вопрос решен для меня на данный момент.

Опять же, это была (или есть) ошибка в EF. И я просто не могу найти ссылку на проблему подключения, но она была там. Так что как решение для всех - просто попробуйте вручную отключить графы объектов перед удалением. Тогда все должно быть в порядке.

0 голосов
/ 24 октября 2011

Поскольку другие говорят, что модульный тест не предназначен для тестирования EF, следует придерживаться его для проверки бизнес-правил. Можете ли вы предоставить больше информации о том, что вы пытаетесь сделать, и мы можем помочь вам.

...