2010-10-06 2 views
1

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

+0

ознакомьтесь с этой статьей: http://oddiandeveloper.blogspot.com/2009/01/linq-to-entities-and-collection-was.html – RPM1984

+0

Обратите внимание, что последнее примечание в вопросе - нет пользовательского кода упоминание коллекций. – Jefim

+0

Этот код может не соответствовать вашим фактическим модульным тестам, но если вам нужно подумать о том, чего вы пытаетесь достичь в этих тестах. Поскольку этот код стоит, вы проверяете только EF, который не является вашей ответственностью, MS уже это сделала. –

ответ

0

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

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

0

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

+0

Опять же, это была проблема с EF. Код выше не является полным тестовым кодом. Это просто часть настройки для теста. – Jefim

Смежные вопросы