EF和WinForms——维护实体的静态列表

本文关键字:静态 列表 实体 维护 WinForms EF | 更新日期: 2023-09-27 18:14:22

我在WinForms应用程序中使用EF 5.0。我很快就处理了DBContext。

然而,我必须维护一个Customer实体的静态列表,我在启动时使用DBContext填充它——同样,处理得很快。另外,我在应用程序的某些部分稍微使用了多线程。

问题是我每隔一段时间就会收到这个异常:

的多个实例不能引用实体对象IEntityChangeTracker .

我应该在处理DBContext之前分离静态列表中的每个Customer吗?我应该为WinForms应用程序使用其他设计吗?感谢您的反馈。

EF和WinForms——维护实体的静态列表

在查询实例时尝试使用AsNoTracking方法:http://msdn.microsoft.com/en-us/library/gg679352(v=vs.103).aspx

考虑构建数据传输对象,使EF和静态列表之间有一个清晰的分离。

这样做的主要好处是限制EF对应用程序其余部分的影响。

我不会使用Customer实体对象列表,而是使用一些镜像类型,例如CustomerListItem

您可以通过将Customer s投影到项目

来填充列表
db.Customers.Select(c => new CustomerListItem { Name = c.Name, ... })

这样做可以创建不被跟踪的对象。并且您将确保实体模型中的更改不会影响依赖于客户列表的应用程序的其他部分。你将不会遇到潜在的延迟加载异常(如果Customer有延迟导航属性)。

因为它是一个对整个应用程序可访问的静态列表,所以我将使用ReadOnlyCollection