模型 类 中的虚拟属性如何违反持久性无知原则?

How could virtual properties in model classes violate the persistence ignorance principle?

我刚刚阅读(修订)了一些架构原则(如此处记录 https://docs.microsoft.com/en-us/dotnet/architecture/modern-web-apps-azure/architectural-principles),对 persistence ignorance 原则有这样一个违规示例感到有点困惑:

 Properties requiring virtual keyword

所以我不清楚为什么这样的要求会违反持久性无知原则。前提是我们的模型 classes 只是在 C# 中,由 .NET 编译器编译。要加载模型实例,只需正常创建 class 实例(所有属性都从相应的持久数据初始化,例如:数据记录)。要保存它,只需从模型实例中读取值并将其放回持久存储(任何类型)。

实际上 Entity Framework 确实需要启用一些很酷的功能,例如延迟加载,......而且我确实看到 EF 在支持各种持久性存储(数据库)方面做得很好,这据我理解应该是违背了所谓的a violation of the persistence ignorance principle.

你能给我一些真实世界的例子来证明 requiring virtual properties 可能违反持久性无知原则吗?如果有的话,是不是有时我们不能只遵守所有原则,我们可能不得不采取一些权衡取舍,以在遵循良好原则和拥有良好功能之间取得平衡(如 EF 的情况?

它违反持久性无知原则的原因很简单:你必须让属性virtual让EF开心,所以你把业务代码改成了持久性问题。除了直接违反原则之外,使用覆盖 class 成员的 EF 功能会更改 class 的类型,因此,例如,在 Equals 实现中,您不能使用 GetType() 不再比较这两个实例,因为对象的实际类型是由 EF 在运行时生成的,因此您再次开始根据持久性问题更改域逻辑。另外,我还建议在大多数情况下不要使用 EF 的延迟加载,因为它只能同步工作,会阻塞当前线程。