Как отсоединить сущности от контекстов EF Code First - PullRequest
4 голосов
/ 18 июня 2011

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

Я пишу сайт регистрации событий, используя 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.»

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

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

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

1 Ответ

14 голосов
/ 18 июня 2011

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

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

... или вы можете отсоединить отдельные объекты от контекста с помощью настроеких состояние до Detached:

context.Entry(raceEvent).State = EntityState.Detached;
...