实体框架不信任投票 - 与 .NET 4 相关吗? [关闭]

2023-12-20

我正在为一个大项目决定使用 ORM,并决定选择 ADO.NET 实体框架,特别是它随 .NET 4 一起提供的新版本。在搜索有关 EF 的信息时,我偶然发现了ADO .NET 实体框架投不信任票 http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/我不知道如何采取。

不信任投票是在 2008 年的某个时候撰写的,目的是说服 Microsoft 听取对 EF v1 的具体批评。

目前尚不清楚不信任投票中提出的主张是否仍然有效(在 .NET 4 中),以及它们是否严重到足以使用其他解决方案。 NHibernate是一个成熟的替代方案,但我不知道它会带来什么问题。我通常更倾向于 Ms 解决方案,主要是因为我可以依靠与 VS 的集成以及他们的开发人员支持。

我将不胜感激examples不信任投票中提到的问题如何影响现实世界的项目。更重要的是,其中的声明在 EF for .NET 4 中仍然相关吗?


我一直认为,“不信任投票”背后的大部分原因是试图将 EF 当作 NHibernate 克隆来使用。事实并非如此,即使在 EF 4 中尝试像 NHibernate 仿制品一样使用 EF 也可能会以失败告终,尽管您可能会在失败之前走得更远。举一个简单的例子,大多数人在 NHibernate 中至少使用 LINQ(如果有的话),而我认为在 EF 中你无法提高工作效率at all除非你非常频繁地使用 LINQ。

另一方面,我在使用 EF 1 本身方面非常成功,并且设法不让人们在博客文章中提出的主张妨碍我使用它。我期待使用 EF 4 中的许多新功能,但我很乐意随时参与结构良好的 EF 1 项目。 (就此而言,我也很高兴与 NHibernate 合作,并且不会批评它不像 EF 那样行事。)

因此,我试图以一种微妙的方式建议,在您决定“不信任投票中提出的主张是否仍然有效(在 .NET 4 中)...”之前,您必须首先决定这些主张是否有效是对你和方式永远有效you work.如果您个人对 O/R 的理解是硬连接到 NHibernate 的,那么 EF 4 对您来说可能仍然是二流的。另一方面,如果您愿意学习 EF 的工作方式,那么甚至 EF 1 可能看起来比您听说的更好。

要直接解决“不信任”声明,并检查其实质内容以及 EF 4 中的更改:

不注重实体的数据方面会导致实体架构退化:

这是对实体框架实体数据模型的误解。 (或者,如果您愿意,也可以提出意见分歧。)但无论哪种方式,它都是一个功能,而不是一个错误。实体框架是围绕更一般的数据服务案例而设计的,而不仅仅是 O/R 建模。将行为放在从数据服务返回的实体上会导致 CORBA 式的灾难。与 ORM 不同,在某种程度上,您会受制于 ORM 黑匣子中出现的任何类型,而使用实体框架模型,您需要将其投影到业务类型上。在这种情况下,映射的实体类型甚至永远不会被具体化。

这是实体框架模型和许多其他 ORM 之间的实质性区别。就我个人而言,我发现将业务行为与 O/R 映射分开比将它们混在一起要干净得多。你不必同意这个想法,但这显然是一个设计决策,而不是一个疏忽。

处理缺乏延迟加载所需的多余代码:

无论好坏,EF 4 都具有延迟加载功能。

我说“无论好坏”是因为延迟加载很容易生成过多的数据库查询。只要您密切关注幕后发生的事情,它就可以正常工作,但大多数人不会这样做。我发现投影 http://blogs.teamb.com/craigstuntz/2009/12/31/38500/大多数时候是延迟加载、预先加载或显式加载的更好替代方案。

尽管如此,有时延迟加载还是很方便的。所以我很高兴看到 EF 4 中添加了它。

共享的规范模型冲突软件最佳实践:

很难知道这是怎么回事,因为一些支持文本甚至不是连贯的英语,例如:

由于缺乏与实体框架类似的复杂工具,容易失败的规范模型方法并不困难。

本节seems表明实体框架对复杂系统使用单一规范数据模型施加了某种要求,或者至少是强烈的偏见。我不确定我是否同意,但鉴于本节中缺乏任何具体示例,因此很难说。所以我会告诉你我自己在这个问题上的偏见,你可以同意或不同意我的观点:

对大型系统使用单一模型通常是错误的,具体取决于系统的实际大小。然而,实体框架中没有任何内容要求您使用单一模型。另一方面,实体框架(尤其是版本 1)并没有竭尽全力使多个模型的组合变得容易。

现在,复杂系统的单个大型应用程序可能会像单个大型数据模型一样犯下严重错误。因此,实体框架让将许多微小模型轻松组合到一个过大的应用程序中是不正确的;这只会用一个问题代替另一个问题。

另一方面,我认为通过以适合问题域的方式划分的服务轻松构建大型系统确实有意义。我认为 WCF 数据服务对此很有用,它是一种独立于实体框架的技术,但它很好地支持实体框架。

我确实认为,在未来的某个版本中,实体框架可以在必要时更轻松地将两个或三个模型组合到单个应用程序中。您现在可以执行此操作,但涉及一些手动工作。但正如我上面所说,我不想通过促进/鼓励创建过大的应用程序来“解决”过大的数据模型的问题。

缺乏持久性的无知导致业务逻辑更难读、写和修改,导致开发和维护成本以夸张的速度增加:

本节提出了我认为错误的主张:

实体框架通过阻止在实体类中包含业务逻辑来鼓励贫血领域模型反模式。

往上看。我认为实体类型的工作是在对象空间中的关系空间之间进行映射。根据单一职责原则,这些类型仅在其唯一工作发生变化时才需要修改。如果业务流程发生变化,那么这是与 O/R 映射无关的责任。也许其他 ORM 的限制对分离这些职责造成了技术障碍。当技术要求时,如果设计纯粹性的成本过高,那么改变规则是可以的。但我强烈支持无行为实体类型的方法。

在当前状态下,EF 实体类无法独立于数据库进行有效的单元测试。

这是错误的 https://stackoverflow.com/questions/2372030/testing-ef-sql-server-based-application-with-in-memory-sqlite/2372137#2372137。写这篇文章的人不明白他们在说什么。我们的单元测试从来没有接触过 DB,而且许多单元测试都涉及 EF。

就本节标题的实质内容而言,EF 4 发生了变化。现在可以拥有完全与持久性无关的实体类型(如果这有助于您的设计)。但是,从最早版本的单词实体框架开始,您就可以投影到 POCO 上。因此,在需要时,持久性无知总是可用的。对实体类型本身具有持久性无知,允许使用持久性无知的对象进行更改跟踪。这在某些情况下可能很有用。但与有关单元测试的虚假声明相比,它的案例子集要小得多,这大大减少了该文档所提出观点的影响。

团队环境中的合并与源代码控制存在过多冲突:

合并 XML 实际上有那么困难吗?如果是这样,也许人们应该研究一种新的合并工具。我不认为这有问题。

然而,这里存在一个真正的问题,尽管它再次比文件声称的范围要窄得多。我不会重复自己,而是会向您指出我关于这个主题的帖子 http://blogs.teamb.com/craigstuntz/2010/02/03/38542/.

在 EF 4 中,可以使用代码优先模型而不是 XML 模型,以便将模型拆分为许多不同的文件。

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

实体框架不信任投票 - 与 .NET 4 相关吗? [关闭] 的相关文章

  • MVVM Light Toolkit 抛出 System.IO.FileLoadException

    我正在运行 VS 2010 和 Expression Blend 4 beta 我从提供的模板创建了一个 MVVM Light 项目 当我尝试在 VS 2010 设计器窗口中查看 MainWindow Xaml 时 出现 System IO
  • 检测 404 而不捕获异常

    简单功能 检查网络服务器是否返回非 200 HTTP 状态 Private Function RemoteFileOk ByVal Url As String As Boolean Dim req As HttpWebRequest Try
  • 未分配给变量的类实例是否会过早被垃圾回收?

    我什至不知道我的问题是否有意义 这只是我不明白的事情 并且在我的脑海中旋转了一段时间 考虑有以下课程 public class MyClass private int myVar public void DoSomething Do som
  • 识别关系并插入子实体会导致“无法在表中插入标识列的显式值”

    我正在尝试在实体框架中获取可识别的关系 以便我可以使用 删除 从其集合中删除项目 我创建了一个测试 例如 public class OrderLine Key Column Order 0 public int OrderLineId ge
  • 执行鼠标单击而不移动光标

    除了移动光标之外 我找不到任何解决方案Cursor类 点击mouse event然后将光标移动到原来的位置 我正在玩SendInput现在可以运行 但仍然没有机会找到好的解决方案 有什么建议吗 您应该使用 Win32 API 使用 user
  • 实体框架 5 - 抽象类型“X”没有映射的后代,因此无法映射

    尝试操作时出现以下错误这个对象 https github com gbirchmeier quickfixn blob master QuickFIXn Message FIX44 TradeCaptureReportRequestAck
  • 用户模式 ​​.NET 设置存储在哪里?

    我想知道 NET 中 settings 文件背后的魔力是什么 假设您创建了一个在此示例中称为的程序集SettingsHolder 您创建一个公共的设置类 其中在用户模式下有一个字符串 然后进行编译 现在 您在 MyApp 中引用您的程序集
  • 使用 Serilog 时如何在输出消息中获取丰富的属性

    我正在尝试使用 Serilog 将丰富的属性输出到渲染的消息中 private static Tester GetTester return new Tester Count 7 Name Redmond Log Logger new Lo
  • 不同提供商的相同 EDMX 文件

    我正在开发一个项目 其中有一个本地数据库 SQL CE 在不存在与服务器的连接的情况下用作缓冲区 在服务器上我想使用相同的数据库布局 当然 我想使用服务器和客户端上可用的 Common dll 中的相同 EDMX 文件 在客户端中 我有一个
  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • 如何解决文件被另一个进程使用的问题?

    我一直在 VS NET 2010 中调试 没有任何问题 但现在无法建造 我收到错误 Unable to copy file filename to bin Debug filename The process cannot access t
  • 如何使用 Linq 将实体表与交叉引用表连接起来

    首先我要说的是 我对 Linq 比较陌生 但我似乎很快就掌握了其中的大部分内容 但这个问题却难倒了我 我找了又找都没有结果 我使用代码优先并创建了 2 个模型 项目 和 关键字 他们之间存在多对多的关系 我的实体模型如下所示 public
  • WPF DataGrid 排序后滚动到顶部

    我有一个使用数据网格的 Net 4 0 WPF 应用程序 目前 按列排序后 网格的滚动位置保持在排序前的位置 对于此应用程序 我需要在任何排序后滚动到网格顶部 我尝试过像这样处理排序事件 Private Sub myDataGrid Sor
  • 如何从实体框架中的 .edmx 文件生成数据库?

    我不得不突然转而使用 Code First Entity Framework 4 1 一开始我对这个框架一无所知 但在过去的 8 个小时里 我现在对阅读博客和文章感到更加自在 特别是这个博客 http blogs msdn com b ad
  • 了解 C# 中的协变和逆变接口

    我在一本有关 C 的教科书中遇到过这些内容 但我很难理解它们 可能是由于缺乏上下文 对于它们是什么以及它们有什么用处 是否有一个很好的简洁解释 编辑以澄清 协变接口 interface IBibble
  • 正则表达式获取模式的最后一次出现

    我有一个字符串 我需要选择最后一次出现的模式 该字符串是 1302638400000 0 0 1302724800000 0 610 64999999999998 1302811200000 0 2266 6500000000001 130
  • 将 KeyDown 事件传递给其他控件

    我正在编写一个 C WinForms 应用程序 NET 4 0 我有一个WinFormsControl on a Form 用户开始使用键盘输入内容后 另一个Control出现 那Control是某种文本输入 我想将用户输入发送到该Cont
  • 从 Microsoft Chart Control 单击数据标记获取鼠标单击事件

    我的应用程序中有一个 net 4 0 点图 我想捕获鼠标在数据标记上的点击 当用户单击特定点时 我想转到绑定表中数据来自的行 此功能是否内置于 net 图表控件中 编辑 我发现我可能实际上想要光标位置值 而不是要求用户单击特定的数据点 一旦
  • 如何计算关联实体而不在实体框架中获取它们

    我想知道这个问题已经有一段时间了 所以我认为值得使用我的第一篇 Stack Overflow 帖子来询问它 想象一下我正在与关联的消息列表进行讨论 DiscussionCategory discussionCategory reposito

随机推荐

  • 为什么活动开始时软键盘显示或不显示?

    当比较开发人员之间的设计时 我们发现了一个奇怪的行为 经过一番分析后 我们进行了这一观察 当活动开始时 在某些情况下键盘会出现 但有时不会 事实上 如果没有ScrollView 默认情况下软键盘不会出现在EditText
  • OSX 中的 tiff() 分辨率和压缩设置不可靠

    分辨率和压缩选项tiff 在我的系统上似乎被忽略 请参阅下面的信息 这似乎与中讨论的问题相同这个问题 https stackoverflow com questions 12609816 r tiff wont compress or se
  • Laravel + Image Intervention:强制下载未保存的文件

    我想简单地上传文件 调整它们的大小 然后强制下载每个上传的文件 我不想保存文件 调整大小等工作正常 但是我无法强制下载新文件 content image gt stream jpg return response gt download c
  • Quickblox 会话在后台过期。怎么处理呢?

    当用户进入后台时 我从聊天中注销该用户 当用户从后台返回时 我会在聊天中再次记录使用情况 这很有效 但并非每次都有效 有时 当用户将应用程序保持在后台超过 2 小时时 会话就会过期 并且当用户从后台返回时 会话似乎不会自动重新验证 即使使用
  • 编译 Java 类并从命令控制台运行 Java 文件时,如何包含 Java jar 文件?

    我有一个与 postgresql 数据库交互的小 Java 文件 所以我已经下载了驱动程序并在我的文件中导入org postgresql Driver 在命令控制台中我输入javac Myfilename java 然后它编译我运行java
  • JavaScript 异步/等待

    我正在尝试理解 JavaScript 异步 等待 如何重写以下内容 使输出为 Hi 然后 Bye 而不是 Bye 然后 Hi JSFiddle https jsfiddle net tp7tjhvL 1 sayHi then sayBye
  • 设置nginx支持自定义域名

    我有一个 Django Web 应用程序托管在一个虚拟机上 该虚拟机以基于 Debian 的 Ubuntu 作为操作系统 以 nginx 反向代理 Gunicorn 作为 Web 服务器 此 Web 应用程序的 DNS 是myapp clo
  • 如何以编程方式在 WordPress 中创建帖子 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想知道如何在 WordPress
  • 我需要向父 div 添加一个像素

    我有一个 教室 的 div 其中包含每个 学生 的 div 每个 学生 div 都包含一个图像 这是 HTML div class classroom div class student img class student image sr
  • 需要 JQuery 弹出窗口/警报

    我有一个元素列表 每个元素需要有一个相应的弹出窗口 这不是背景变黑的弹出窗口 这更像是一个 JavaScript 警报 尽管我需要在弹出窗口中创建自己的样式按钮 并为其分配我们自己的定制事件 我需要每个弹出窗口将自己适当地放置在用户界面中相
  • 解析接受标头

    有人对解析 HTTP Accept 标头有任何建议 或正则表达式 吗 我正在尝试在 ASP NET MVC 中进行一些内容类型协商 似乎没有内置的方式 这很好 因为这里有很多思想流派 但是解析并不完全微不足道 如果有人已经完成了 我宁愿不重
  • 如何将字符串渲染为html链接

    我向电子邮件发送一些消息 如下所示 string link http localhost 1900 ResetPassword username user UserName reset HashResetParams user UserNa
  • IntelliJ IDEA v12 中的警告

    给出的答案为如何让Intellij Idea显示编译警告 https stackoverflow com questions 4745415 how to get intellij idea to display compilation w
  • 为什么将“extern puts”转换为函数指针“(void(*)(char*))&puts”?

    我正在看例子abo3 c http community corest com gera InsecureProgramming abo3 html from 不安全编程 http community corest com gera Inse
  • 当我使用 Python 的调试版本时,如何使用 gdb?

    我的 gdb 版本与我的系统 python 链接 但我目前正在使用 python 的特殊调试版本 因此 gdb 无法正确启动 并出现如下错误 gdb gdb Symbol Py ZeroStruct has different size i
  • 为什么我的数组在 AJAX 函数之外的行为不同? (填充 jsTree)[重复]

    这个问题在这里已经有答案了 长话短说 我正在为 jsTree 创建一个类似 JSON 的数组 我不明白的是为什么数组非常适合我在 AJAX 成功函数中的需求 但又损坏了outside该功能的 查看我的控制台转储的屏幕截图 您可以看到差异 为
  • 在 Google 地图中绘制一个点周围的半径

    我正在使用 Google Maps API 并添加了标记 现在我想在每个标记周围添加 10 英里的半径 这意味着在缩放时会出现适当的圆形 我不知道该怎么做 而且这似乎不常见 我发现一个看起来不错的例子 http www freemaptoo
  • 如何在不给单元格区域命名的情况下选择单元格区域?

    我想使用应用程序脚本选择单元格 C29 Z50 作为变量 我不想创建命名范围 但如果需要的话我可以 我的目标是创建一些超越颜色的自定义格式 可以使用内置功能 因此 如果单元格 B27 交易 则将 C29 Z50 格式化为数字 否则将 Z29
  • MVC4 Bundle 中的 {version} 通配符

    在 MVC 4 中 我们有捆绑包 在定义捆绑包时 我们可以对文件夹中的所有文件使用 等通配符 在下面的例子中 什么是 version mean public static void RegisterBundles BundleCollect
  • 实体框架不信任投票 - 与 .NET 4 相关吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动