如何从EF Code First上下文中分离实体

时间:2011-06-18 16:50:08

标签: entity-framework-4 objectcontext

这似乎比它应该更难。

我正在使用MVC3,SQL Compact Edition和Entity Frameworks Code First编写事件注册站点,并使用Steven Sanderson的Mvc Scaffolding NuGet包。

由于事件列表不太可能发生太大变化,我将其缓存到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是全球可用的列表。

我的问题是,当我创建一个带有外键的注册人记录回到存储在EventRaces中的RaceEvent时,我收到一个错误“IEntityChangeTracker的多个实例无法引用实体对象。” p>

根据几篇博文和SO答案,我需要像Listing 1 of this post中那样从上下文中分离缓存的实体。

我的问题是,使用ObjectBrowser,我找不到任何带有Detach方法的东西。存储库中的上下文没有。上下文中的各个DbSets没有(尽管它们具有Attach()方法)。 System.Data.Object.ObjectSet有一个,但我找不到DbSet和ObjectSet之间的映射。

显然,我错过了一些东西。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:14)

您可以使用AsNoTracking扩展方法查询列表,而无需将对象附加到上下文...

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

...或者您可以通过将状态设置为Detached来分离上下文中的单个实体:

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