Entity framework 4 如何从EF代码优先上下文中分离实体

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

这似乎比应该的困难得多

我正在首先使用MVC3、SQL Compact Edition和实体框架代码编写一个事件注册站点,并使用Steven Sanderson的Mvc Scaffolding NuGet包

由于事件列表可能不会有太大变化,我将其缓存到应用程序启动方法中的全局列表中:

        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