如何解决如何从EF Code First上下文中分离实体
| 这似乎比应做的要难得多。 我正在使用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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。