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

问题描述

| 这似乎比应做的要难得多。 我正在使用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实例引用实体对象。” 根据几篇博客文章和SO的答案,我需要从上下文分离缓存的实体,如这篇文章的清单1所示。 我的问题是,使用Objectbrowser,我无法使用Detach方法找到任何东西。存储库中的上下文没有一个。上下文中的各个DbSet没有一个(尽管它们具有Attach()方法)。 System.Data.Object.ObjectSet有一个,但是我找不到DbSet和ObjectSet之间的映射。 显然,我缺少了一些东西。有人可以指出我正确的方向吗?     

解决方法

        您可以使用
AsNoTracking
扩展方法查询列表,而无需将对象附加到上下文...
var repo = new RaceEventRepository();
EventRaces = repo.All.AsNoTracking()
    .Where(r => r.RaceName.Contains(eventName))
    .ToList();
...或者您可以通过将单个实体的状态设置为
Detached
来从上下文中分离单个实体:
context.Entry(raceEvent).State = EntityState.Detached;