Как отсоединить сущности от контекстов EF Code First

Это кажется намного сложнее, чем должно быть.

Я пишу сайт регистрации событий, используя MVC3, SQL Compact Edition и Entity Frameworks Code First, а также использую пакет NuGet Стивена Сандерсона Mvc Scaffolding.

Поскольку список событий вряд ли сильно изменится, я кэширую его в глобальный список в методе Application_Start:

        var repo = new RaceEventRepository();
            EventRaces =
                repo.All.Where(r => r.RaceName.Contains(eventName)).Select(r => r).ToList();

где RaceEventRepository — это класс репозитория, созданный MvcScaffolding, и выполняет

EventContext context = new EventContext();

который затем используется через репозиторий и (я полагаю) удаляется при удалении репозитория. а EventRaces — это глобально доступный список.

Моя проблема заключается в том, что когда я затем создаю запись регистранта с внешним ключом обратно в RaceEvent, который хранится в EventRaces, я получаю сообщение об ошибке «На объект сущности не может ссылаться несколько экземпляров IEntityChangeTracker».

Согласно нескольким сообщениям в блогах и ответам SO, мне нужно отделить кэшированные объекты от контекста, как в Список 1 этого сообщения.

Моя проблема в том, что с помощью ObjectBrowser я ничего не могу найти с помощью метода Detach. контекст в репозитории не имеет его. Отдельные наборы DbSet в контексте не имеют его (хотя у них есть метод Attach()). System.Data.Object.ObjectSet имеет один, но я не могу найти сопоставление между DbSet и ObjectSet.

Ясно, я что-то упускаю. Может ли кто-нибудь указать мне в правильном направлении?


person Dave Hanna    schedule 18.06.2011    source источник


Ответы (1)


Вы можете либо использовать метод расширения AsNoTracking для запроса списка без привязки объектов к контексту...

var repo = new RaceEventRepository();
EventRaces = repo.All.AsNoTracking()
    .Where(r => r.RaceName.Contains(eventName))
    .ToList();

... или вы можете отделить отдельные объекты от контекста, установив их состояние на Detached:

context.Entry(raceEvent).State = EntityState.Detached;
person Slauma    schedule 18.06.2011
comment
AsNoTracking решил мою проблему. Спасибо за быстрый ответ. - person Dave Hanna; 19.06.2011
comment
Будет ли это распространяться на все сущности EF в иерархии? что означает, если у меня есть объект, у которого есть другой объект в качестве ключа forigen? - person Elad Benda; 05.02.2013
comment
@EladBenda: Для AsNoTracking: Да. Для установки состояния на Detached: Нет. - person Slauma; 05.02.2013
comment
Когда я также использую Iclude()? Здесь радужно? - person Elad Benda; 06.02.2013
comment
@EladBenda: Если вы хотите загрузить связанные объекты вместе с родителем, вам нужен Include, независимо от того, используете ли вы AsNoTracking или нет. - person Slauma; 06.02.2013