Entity framework 4 如何从EF代码优先上下文中分离实体
这似乎比应该的困难得多 我正在首先使用MVC3、SQL Compact Edition和实体框架代码编写一个事件注册站点,并使用Steven Sanderson的Mvc Scaffolding NuGet包 由于事件列表可能不会有太大变化,我将其缓存到应用程序启动方法中的全局列表中:Entity framework 4 如何从EF代码优先上下文中分离实体,entity-framework-4,objectcontext,Entity Framework 4,Objectcontext,这似乎比应该的困难得多 我正在首先使用MVC3、SQL Compact Edition和实体框架代码编写一个事件注册站点,并使用Steven Sanderson的Mvc Scaffolding NuGet包 由于事件列表可能不会有太大变化,我将其缓存到应用程序启动方法中的全局列表中: var repo = new RaceEventRepository(); EventRaces = repo.All.Where(r =&g
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时,我得到了一个错误“entity对象不能被多个IEntityChangeTracker实例引用”
根据几篇博客文章和答案,我需要从上下文中分离缓存的实体,如中所示
我的问题是,使用ObjectBrowser,我找不到任何具有分离方法的内容。存储库中的上下文没有上下文。上下文中的单个dbset没有一个(尽管它们有一个Attach()方法)。System.Data.Object.ObjectSet有一个,但我找不到DbSet和ObjectSet之间的映射
很明显,我遗漏了一些东西。谁能给我指一下正确的方向吗 您可以使用
AsNoTracking
扩展方法来查询列表,而无需将对象附加到上下文中
var repo = new RaceEventRepository();
EventRaces = repo.All.AsNoTracking()
.Where(r => r.RaceName.Contains(eventName))
.ToList();
。。。或者,通过将单个实体的状态设置为“已分离”,可以从上下文中分离单个实体:
context.Entry(raceEvent).State = EntityState.Detached;
AsNoTracking解决了我的问题。感谢您的快速回复。这会渗透到Hirachy中的所有EF实体吗?这意味着如果我的实体有另一个实体作为forigen键?@EladBenda:For
AsNoTracking
:是。用于将状态设置为分离:否。我什么时候也要使用Iclude()?这里是radudent吗?@EladBenda:如果要将相关实体与父实体一起加载,则无论是否使用AsNoTracking
,都需要Include
。