这似乎比它应该更难。
我正在使用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之间的映射。
显然,我错过了一些东西。有人能指出我正确的方向吗?答案 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;