我在WinForms应用程序中使用EF 5.0。我快速处理DBContext。
尽管如此,我必须维护一个Customer
实体的静态列表,我在启动时使用DBContext填充 - 再次快速处理。另外,我在应用程序的某些部分使用多线程。
问题是我每隔一段时间就收到一次这个例外:
实体对象不能被多个实例引用 IEntityChangeTracker。
在处理DBContext之前,我应该在静态列表中分离每个Customer
吗?我应该为WinForms应用程序使用其他一些设计吗?感谢您的反馈。
答案 0 :(得分:2)
在查询实例时尝试使用AsNoTracking方法:http://msdn.microsoft.com/en-us/library/gg679352(v=vs.103).aspx
答案 1 :(得分:2)
考虑构建Data Transfer Objects以在EF和静态列表之间进行清晰的分离。
这样做的主要好处是限制了EF对其他应用程序的影响。
答案 2 :(得分:1)
我不会使用Customer
实体对象列表,而是使用某种镜像类型,比如CustomerListItem
。
您可以通过将Customer
投影到商品
db.Customers.Select(c => new CustomerListItem { Name = c.Name, ... })
通过执行此操作,您可以创建未跟踪的对象。并且您将确保实体模型中的更改不会影响依赖于客户列表的应用程序的其他部分。 和您不会遇到潜在的延迟加载异常(如果Customer
具有延迟导航属性)。
因为它是整个应用程序可访问的静态列表,所以我会使用ReadOnlyCollection
。