Dav*_*nna 4 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();
Run Code Online (Sandbox Code Playgroud)
其中RaceEventRepository是由MvcScaffolding构造的存储库类,并且执行
EventContext context = new EventContext();
Run Code Online (Sandbox Code Playgroud)
然后在存储库中使用它,并且(我假设)在存储库被处置时被处置掉.和EventRaces是一个全球可用的列表.
我的问题是,当我创建一个带有外键的注册人记录回到存储在EventRaces中的RaceEvent时,我收到一个错误"IEntityChangeTracker的多个实例无法引用实体对象."
根据几篇博客文章和SO答案,我需要从上下文中分离缓存的实体,如本文清单1所示.
我的问题是,使用ObjectBrowser,我找不到任何带有Detach方法的东西.存储库中的上下文没有.上下文中的各个DbSets没有(尽管它们具有Attach()方法).System.Data.Object.ObjectSet有一个,但我找不到DbSet和ObjectSet之间的映射.
显然,我错过了一些东西.有人能指出我正确的方向吗?
Sla*_*uma 14
您可以使用AsNoTracking扩展方法查询列表,而无需将对象附加到上下文...
var repo = new RaceEventRepository();
EventRaces = repo.All.AsNoTracking()
.Where(r => r.RaceName.Contains(eventName))
.ToList();
Run Code Online (Sandbox Code Playgroud)
...或者您可以通过将其状态设置为Detached以下内容从上下文中分离单个实体:
context.Entry(raceEvent).State = EntityState.Detached;
Run Code Online (Sandbox Code Playgroud)