使用 Entity Framework Core 时的不可变对象

mar*_*sco 4 .net c# autofac entity-framework-core

一般来说,我对 oop 和编程相当陌生,但有一件事我不明白,在使用 EF core 等关系数据库时,是否应该拥有不可变对象。如果我使用私有设置器设置属性,以便我只能在创建这些对象时分配值,我该如何更改它们的状态?我是否创建一个新的空对象,然后复制需要保持不变的每个属性并仅更新其中一些属性myObject.property = updatedValue?我是否使用工厂用正确的值实例化该对象?使用公共 setter 是否违反了 oop 原则?

例如,当服务器和客户端交换数据并且客户端对此数据进行一些处理时,我遇到了这个问题。当数据返回时,使用 dto 类,我仍然需要更新保存在数据库中的相关数据。

Fat*_*eni 7

EF Core 确实支持不变性,更具体地说,它可以利用实体​​的构造函数。这使您能够为实体创建纯粹不可变的属性(仅生成只读支持字段的 getter),甚至整个实体也可以是不可变的。

\n

需要考虑的一些要点:

\n
    \n
  • 默认情况下,EF 排除/忽略所有仅带有 getter 的属性。它假设它们是计算属性。对于这些属性,我们应该显式配置 EF 以将它们包含在模型中。
  • \n
  • 如果我们在模型中包含只读属性,EF 将需要一个构造函数(可能被标记为私有)以及这些属性的匹配参数。您必须有一个仅接受这些属性参数的构造函数,不包括可变属性。
  • \n
  • 构造函数参数的命名应与属性完全相同。除第一个字符外,命名区分大小写。对于给定的 FirstName 属性,您可以将参数定义为 FirstName 或firstName,但不能定义为firstname。这是一个常见的错误。
  • \n
  • 如果您已将不可变拥有类型(例如,值对象)定义为实体的一部分,则可能不得不将它们添加为构造函数参数。这样做将是一个不正确的配置,并且您\xe2\x80\x99将面临运行时异常。EF Core 分别创建这些对象的实例,并具有将这些对象映射到实体的不同内部机制。
  • \n
\n

我在这篇博文中更详细地阐述了。

\n