这似乎比它应该做的要难得多。
我正在使用MVC3、SQL Compact Edition和实体框架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的多个实例引用”。
根据几篇博客文章等回答,我需要像Listing 1 of this post那样将缓存的实体从上下文中分离出来。
我的问题是,使用ObjectBrowser时,我找不到任何具有分离方法的内容。存储库中的上下文没有上下文。上下文中的单个DbSets没有(尽管它们有一个Attach()方法)。System.Data.Object.ObjectSet有一个,但我找不到DbSet和ObjectSet之间的映射。
很明显,我漏掉了什么。谁能给我指个方向?
发布于 2011-06-19 03:07:10
您可以使用AsNoTracking扩展方法来查询您的列表,而无需将对象附加到上下文...
var repo = new RaceEventRepository();
EventRaces = repo.All.AsNoTracking()
.Where(r => r.RaceName.Contains(eventName))
.ToList();..。或者,您可以通过将单个实体的状态设置为Detached来将其与上下文分离
context.Entry(raceEvent).State = EntityState.Detached;https://stackoverflow.com/questions/6397465
复制相似问题