问题描述
|
这似乎比应做的要难得多。
我正在使用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;