c# - 使用 Entity Framework Core 时的不可变对象(immutable对象)

标签 c# .net entity-framework-core autofac

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

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

最佳答案

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

需要考虑的几点:

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

我已在此 blog post 中进行了更详细的阐述.

关于c# - 使用 Entity Framework Core 时的不可变对象(immutable对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65523910/

相关文章:

c# - 遍历枚举

c# - 如何仅在需要时提升权限?

.net - .NET ThreadPool 线程在返回池时是否会重置?

.net-core - 找不到方法 : 'System.Reflection.MethodInfo Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.get_SelectAsyncMethod()'

xamarin - 在 Android 7+ 上使用 EF7 SQLite

c# - 从 HttpTrigger 函数读取 Azure IoT 中心遥测

c# - 在串行端口的 DataReceived 事件处理程序中读取数据时尝试显示文本时出现死锁

c# - ASP NET MVC Web API 架构

.net - 如何在PowerShell中添加事件 Action 处理程序

c# - EF核心: "The LINQ expression could not be translated" when using explicit casting