我最近切换到 Entity Framework 5。现在,我想从现有数据库生成 POCO 类,并且我需要延迟加载和更改跟踪。所以所有的标量属性都应该是虚拟的以及导航属性。
添加新的 ADO.Net 实体数据模型以 .edmx 文件和其他一些 .cs 和 .tt 文件结尾。
首先,我想知道为什么默认生成的 POCO 类不满足更改跟踪代理的要求,即标量属性不是虚拟的。
其次,如何生成启用代理的 poco 类?
PS:我接受了 Slauma 的答案作为迄今为止最好和唯一的答案,但我不同意它的第一部分。这是我的论点
Slauma 谈到了代理的两个问题:限制和性能:
关于启用代理的实体的限制:当实体框架在 DB First 方法中生成类时,类必须遵循以启用更改跟踪代理的规则并不那么重要,因为它们根本没有限制性。谁真正关心导航集合是 IList 还是 HashSet?仅当应用程序中有设计好的类并且要从中生成表时,才有意义谈论这些限制。
DB 首先不支持复杂属性。所以我们可以将它们排除在我们的讨论之外。
关于性能:在所讨论的文章中以及到目前为止我研究过的一些其他实验,结果并不是很有说服力地拒绝代理以支持快照。首先,实验是在大量实体(即 10,000 个)上进行的。您的应用程序(而不是数据库)中的批处理处理大量实体并非不可能,但是假设有更好的方法,例如存储过程。其次,根据应用程序的类型和需求,我们通常处理的实体数量很少,例如在实现和使用存储库模式时;代理和快照的性能没有区别。有趣的是,在所讨论的实验中,将相同的值重新分配给属性是代理性能显着失败的唯一情况。但真正做到这一点的是谁?很容易小心避免重复通知更改跟踪器。同样,在这种情况下,当处理大量实体时会出现重大问题。