.NET ORM、不可变值对象、结构、默认构造函数和只读属性

2024-02-14

我刚刚开始使用 .NET ORM,甚至还没有在 Entity Framework 和 NHibernate 之间做出决定。但在这两种情况下,我都遇到了一个问题,因为他们似乎希望我以各种方式损害域模型的完整性,特别是在 C# 对象设计的更精细的方面。这是有关该主题的几个问题之一。


我非常习惯使用如下所示的模式对适当的属性强制执行不变性:

public class Foo
{
    private readonly string bar;
    public string Bar { return this.bar; }

    public Foo(string bar)
    {
        this.bar = bar;
    }
}

NHibernate 或实体框架似乎不支持这一点。他们想要默认构造函数和public设置器;看起来甚至privatesetter(和默认构造函数)可以工作(有时?),因为 ORM 可以使用反射。

我想我可以通过使用来解决这些问题private二传手和一个private默认构造函数。至少公共 API 不会受到损害。只是我正在修改所有类的实现以添加未使用的private建设者,并且必须相信他理解的未来多梅尼克private在我的设置器上实际上意味着“除了在构造函数中之外不要调用我”。持久层正在泄漏到我的领域对象设计中。

它似乎也没有必要——为什么 ORM 不知道使用非默认构造函数?也许他们能够做到,但我只是没有找到合适的博客文章来解释如何做到这一点。

最后,在某些情况下我的不可变的值对象实际上很适合(不可变)值类型, i.e. structs。我的猜测是这是可能的,因为在数据库中,我的结构的字段将显示在存储父实体的同一行中。你能确认/否认吗?这篇博文 http://geekswithblogs.net/opiesblog/archive/2006/08/05/87218.aspx看起来很有希望,因为它给出了肯定的答案,但代码量(实际上特定于所讨论的值类型)令人震惊。


令人沮丧的是,经过几年的阅读,像这样的书有效的 C#或者像 Eric Lippert 这样的博客,它们就如何设计富有表现力和防弹的 C# 对象提供了很好的建议,但使用 ORM 的需要让我把很多知识抛到了九霄云外。我希望这里有人能够指出我错在哪里,无论是在我对他们能力的理解上,还是在我对领域建模和 ORM 的作用的思考上。


正如评论所指出的,当/如果你采用 ORM 时,你将不得不做出一些妥协。我认为要记住的是,生产力的提高远远超过这些妥协的“成本”。

我确实想向您指出(因为您是 EF 的新手)您可以自定义T4模板 http://msdn.microsoft.com/en-us/data/gg558520生成 EF 实体和上下文。我认为如果你尝试一下这个,你可以解决大部分你不喜欢的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET ORM、不可变值对象、结构、默认构造函数和只读属性 的相关文章

  • 点击浏览器后退按钮时如何刷新 ASP .NET MVC 页面

    我刚刚发现 当我单击任何 ASP NET MVC 页面上的浏览器后退按钮时 没有任何反应 并且页面不会更新 并且只有当您单击 F5 时才会更新 主要问题是我对页面的 DOM 进行了一些更改 即添加表格行 选择单选按钮等 当我通过点击浏览器后
  • 忽略挂起的更改中的某些文件

    这是我的问题 我已经更改了解决方案中的某些文件 假设是 Web config 并且永远不想签入 因为这些更改仅涉及我的计算机 有没有办法在 TFS 中忽略某个文件中的更改并将其从挂起的更改窗口中删除 当然 我可以在每次签入时跳过这个文件 但
  • Wix - 自定义安装目录

    我使用的是 Wix 3 x 用户应该能够选择目标目录 我的Setup wxs目前是这样的 http pastebin com uH1EjbDQ http pastebin com uH1EjbDQ 询问用户自定义目标目录的最简单方法是什么
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • .NET UI 元素线程限制的原因

    我们知道 除了实例化元素的线程之外 不可能从任何线程执行操作任何 UI 元素属性的代码 我的问题是 为什么 我记得当我们使用 COM 用户界面元素时 在 COM Visual Basic 6 0 时代 所有 UI 元素都是使用 COM 类和
  • 添加 LINQ 的 LongCount 扩展方法是否有实际原因?

    LINQ 有 2 种计算可枚举数的方法 Count and LongCount 实际上 这两者之间的唯一区别是第一个返回一个int 而第二个返回一个long 我不清楚为什么添加第二种方法 它的唯一用例似乎是处理超过 2B 元素的枚举 对我来
  • 我应该如何缓冲绘制的矩形以提高性能(C#/.NET/WinForms/GDI+)

    我在做什么 我正在开发一个 C NET 4 7 2 WinForms 应用程序 它使用以下命令在表单上绘制大量填充矩形Graphics FillRectangle https learn microsoft com en us dotnet
  • 捕获特定的 WebException (550)

    假设我创建并执行一个System Net FtpWebRequest 我可以用catch WebException ex 捕获此请求引发的任何与 Web 相关的异常 但是 如果我有一些逻辑只想在由于以下原因引发异常时执行 550 file
  • 为什么在为 Silverlight 5 应用程序添加编码 UI 支持时 System.Core 无法加载?

    我遇到以下问题 尝试添加对为 Silverlight 5 应用程序创建编码 UI 测试的支持 MSDN 1 第一步是在 Silverlight 5 项目中引用程序集 Microsoft VisualStudio TestTools UITe
  • 将 Xml 反序列化为对象时出错 - xmlns='' 不是预期的

    我在尝试反序列化某些 XML 时遇到了真正的麻烦 希望有人可以提供一些帮助 我读过很多类似的帖子 但我无法解决这个问题 我正在尝试反序列化 XML
  • 如何在Web网格的列中编写IF条件

    我在 WEB GRID 列中创建 if 条件时遇到错误 所以 请帮助改进我的代码并解决我的问题 grid Column Status format item gt
  • MonoState、Singleton 或派生形式:CRUD 应用程序的最佳方法?

    我有一个相当大的 CRUD WinForm 应用程序 其中有许多对象 人员 注册 计划 案例注释等 该应用程序由 30 多种表单组成 UI 逻辑上被分解 会员 注册 计划 案例说明等 我正在尝试弄清楚如何创建我的人物对象搜索后搜索表格并将对
  • 使用 DependencyResolver 通过 MVC 3 进行控制器实例化时出错

    我正在使用 MVC 3 并在应用程序启动时使用以下代码 UnityContainer container new UnityContainer new UnityMappings container DependencyResolver S
  • 删除 TableLayoutPanel 中的特定行

    我有 TableLayoutPanel 我以编程方式添加行 用户基本上选择一个属性 然后与一些控件一起显示在表中 我想我在这里有一个一般性的理解问题 我会尽力解释它 每行中的控件之一是 删除 按钮 该按钮应该删除它所在的行 我所做的是将事件
  • 检查 DBNull 会引发 StrongTypingException

    我正在使用数据集从数据库中提取数据 一行中的一个字段是NULL 我知道这个 但是 以下 vb net 代码会抛出StrongTypingException 在数据集设计器中自动生成的 get SomeField 方法中 If Not IsD
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 在.rdlc报告的底部设置一个文本框

    我在 rdlc 报告中使用 tablix 有一个文本框 其中包含文本 签名 我想将此文本框放置在报告最后一页的底部 就在页脚之前 我已经用谷歌搜索了这个解决方案 但没有找到满意的结果 我的环境是VS2010 framework 4 0 有什
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ

随机推荐

  • 在图像下方显示文本

    我有一个带有超链接的图像 并且想在图像下方显示文本 编辑 我的输出应该像在记分卡下一样 我需要看到一张图像 谷歌 及其下方的文本 而在仪表板下 我需要看到两张图像 亚马逊 微软 及其下方的文本 下图是我所期待的 看图片 https i st
  • 覆盖没有默认值的 CSS 属性

    如果 CSS 中的属性没有默认值 是否可以覆盖该属性 例如 假设您的主样式表定义了特定元素的边框 element border 1px solid 000 如果您想禁用辅助样式表的边框 您可以这样做 element border none
  • WordPress图片上传使用ajax?

    我正在 WordPress 中制作前端分析器 我想从前端上传用户照片 我的整个个人资料都在 WordPress ajax 上 我只是想将照片上传到wp content uploads 但从前面使用ajax 我想要两件事 1 媒体挂钩 2 通
  • Spring Security中WebExpressionVoter和AuthenticatedVoter的区别

    Spring Security中的WebExpressionVoter和AuthenticatedVoter有什么区别 我所知道的是 AuthenticatedVoter 将搜索字符串 IS AUTHENTICATED FULLY IS A
  • 键入:从有效值列表动态创建文字别名

    我有一个函数验证其参数以仅接受给定的有效选项列表中的值 在打字方面 我使用Literal输入别名 如下所示 from typing import Literal VALID ARGUMENTS foo bar Argument Litera
  • C 猜数字游戏,使用 isdigit() 验证

    我正在研究教科书上的一个挑战问题 我应该生成一个 1 10 之间的随机数 让用户猜测 并使用 isdigit 验证他们的响应 我 大部分 让程序与下面的代码一起工作 我遇到的主要问题是 使用 isdigit 需要将输入存储为字符 然后我必须
  • 在处理给定的数据集时,如何为 zlib 'setDictionary' 找到一个好的/最佳的字典?

    我有一组 大量 类似的数据文件 该集合正在不断增长 单个文件大小约为10K 每个文件必须单独压缩 压缩是通过 zlib 库完成的 该库由java util zip Deflater班级 当使用以下方式将字典传递给 Deflate 算法时se
  • ElasticSearch 是用于自动完成\提前输入的 edgeNGram,我的 search_analyzer 是否被忽略

    我有三个带有 userName 字段的文档 布里安迪利 布里昂布尔 布里安格里芬 当我搜索 brian 时 我会按预期返回所有三个 但是当我搜索 briandilley 时 我仍然会返回所有三个 分析 API 告诉我它在我的搜索字符串上使用
  • 随着窗口大小的调整而向上移动图像或 Div?

    我的 html 中有一个带有 stretch 类的图像 目前 使用 css 该图像的大小会随着窗口大小的调整而调整为屏幕宽度的 100 我还希望它在调整窗口大小时向上移动 我假设这可以用 jQuery 来完成 但我不太确定 基本上 顶部 C
  • 如何预选struts html:radio按钮

    如何预选struts 1 html radio按钮 谢谢 玛丽亚 你应该有自己的价值Form保存单选按钮数据的对象 您需要将其预先填写在您的Form在转发到 JSP 之前 或者默认在Form的构造函数 如果它始终默认为该值 动作 java
  • Google 地图 javascript API 中的“我的位置”

    有没有办法使用存在于上的 我的位置 按钮谷歌地图 http maps google com 在你自己的 webbapplication 中使用 javascript api 吗 我在这里阅读了有关添加控件的内容Google 地图 Javas
  • 使用引用 MySQL 中相同表的子查询的 SQL UPDATE

    我正在尝试使用 UPDATE 更新表中一堆行中的列值 问题是我需要使用子查询来导出该列的值 并且它依赖于同一个表 这是查询 UPDATE user account student SET student student education
  • 似乎无法解析 KeyedByTypeCollection?

    我正在使用 NET 可移植来创建一个库 并且在尝试创建 KeyedByTypeCollection 的实例时遇到了一些问题 我检查了我的参考资料 NET Portable Subset System Collections Generic
  • React Native - SQLite 找不到预填充的数据库文件

    我正在尝试使用https github com andpor react native sqlite storage https github com andpor react native sqlite storage对于 SQLite
  • 我们如何在没有第三个变量和算术运算符的情况下交换两个数字?

    我们如何在没有第三个变量和算术运算符的情况下交换两个数字 XOR算不算算术运算符 如果没有 那么 X X XOR Y Y X XOR Y X X XOR Y 将此伪代码转换为可编译的 Java 代码作为练习留给读者 关于 java 标签
  • docker-compose如何引用其他目录中的文件

    有这个 dockerfile FROM python 3 8 3 alpine ENV MICRO SERVICE home app microservice RUN addgroup S APP USER adduser S APP US
  • CordovaWebView 与 android 中的 onBackPressed 方法混淆

    正如标题所说CordovaWebView and onBackPressed在 android 中组合起来会产生奇怪的结果 我有混合应用程序 我的主要活动有DrawerLayout and CordovaWebView 我的 onBackP
  • android ndk数据保存/加载

    我正在致力于将 PC OpenGL 应用程序移植到 Android 上 我选择使用 NDK android native app glue 框架 据我了解 它允许我继续使用 C 甚至不编写任何 JAVA 代码行 听起来很有希望 对我来说第一
  • 将加密的 csv 导入 Python 3

    因此 我计划使用 Jupyter Notebook Python 3 进行一些数据分析 出于协作原因 我想将数据存储在 github 存储库上 但数据集很敏感 因此 我想将数据 当前为 csv 作为加密文件存储在存储库上 然后在运行时解密
  • .NET ORM、不可变值对象、结构、默认构造函数和只读属性

    我刚刚开始使用 NET ORM 甚至还没有在 Entity Framework 和 NHibernate 之间做出决定 但在这两种情况下 我都遇到了一个问题 因为他们似乎希望我以各种方式损害域模型的完整性 特别是在 C 对象设计的更精细的方