何时不使用实体框架
Posted
技术标签:
【中文标题】何时不使用实体框架【英文标题】:When NOT to use the Entity Framework 【发布时间】:2010-10-05 18:42:48 【问题描述】:我一直在玩 EF,看看它可以处理什么。还有许多文章和帖子解释了可以使用 EF 的各种场景,但是如果以某种方式错过了“con”方面。现在我的问题是,在哪些情况下我应该远离实体框架?
如果您在该领域有一些经验,请告诉我哪些场景不能很好地与 EF 配合使用。告诉我您在希望选择不同技术时遇到的一些不利因素。
【问题讨论】:
这个问题的答案已经过时,仅供参考。 【参考方案1】:Vote of No Confidence 列出了一些错误和/或功能缺失的部分,这些人认为他们知道哪些特性及其实现适合 ORM/Datamapper 框架。
如果这些问题对您来说都不是大问题,那么我不明白您为什么不应该使用它。我还没有听说这是一个左右爆炸的马车混乱。所有反对它的警告都是哲学的。我碰巧同意不信任投票,但这并不意味着你应该。如果你碰巧喜欢 EF 的工作方式,那就去吧。同时,我建议您至少阅读不信任投票,并尝试对每个问题有一个基本的了解,以便做出明智的决定。
在该问题之外以及您问题的核心 - 您需要密切关注正在生成的 Sql,以便您可以在性能问题进入生产之前进行调整。即使您在后端使用 procs,我仍然会寻找您可能多次访问数据库的场景,然后相应地重新处理映射或获取场景。
【讨论】:
这是一个新手 EF 问题 - 我不认为你可以在 EF 中使用存储过程?正如您所说,我的印象是所有 SQL 都是自动生成的。 看起来确实如此,但我没有这方面的经验。 msdn.microsoft.com/en-us/library/bb399203.aspx 话虽如此,与所有具有动态 SQL 引擎的 o/r 映射器一样,我只建议在生成的 SQL 有问题的情况下使用 procs。 @Daniel:+1 表示“所有反对它的警告都是哲学上的”。不信任投票读起来像博士论文。 @Duncan:您可以将存储过程与 EF 一起使用。如果您不喜欢自动生成的 SQL(到目前为止我还没有遇到问题,但这是可能的),或者如果您想将现有的基于 sprocs 的应用程序缓慢地移植到 EF,这很方便。 我相信那篇文章中唯一真正有效的论点是关于 edmx 上的源代码控制争用。不过这个问题用code first CTP解决了。 达兹...是的。自从提出这个问题以来,发生了很多变化。 EF 4 尤其是代码优先的 CTP 解决了许多最初的问题。【参考方案2】:一个潜在的大问题:Entity Framework 1.0 不支持持久性无知。这意味着您的业务层依赖于您的数据访问层。
如果您的整个应用程序将托管在同一进程中(如 IIS 上的网站),那么这没有问题。
但是,如果您需要远程访问实体(例如到 Silverlight 或 Windows Mobile 客户端),那么您的实体将不会轻易地通过网络进行序列化。您必须创建单独的数据传输类以通过网络发送您的实体,并创建额外的逻辑来在您的实体类和 DTO 之间编组数据。
编辑:拼写。
【讨论】:
不能这样解决吗:通过 WCF Web 服务(使用 ADO.NET 数据服务)发布实体,并通过客户端应用程序上的代理使用实体。那不行吗? 是的,它可以(我认为!)。看我的回答! 这并不正确 - 您可以从 ObjectContext 中分离实体,将它们发送到任何地方进行处理,然后返回并将它们附加回 ObjectContext 以持久化回数据存储区。【参考方案3】:我也只是在“玩弄”阶段,虽然我担心缺乏内置的持久性不可知论,但我确信会有一个“解决方法”。
事实上,在 n 层架构中甚至没有变通办法。
WCF + EF
如果我正确阅读了article,那么我看不到通过网络(使用 WCF)序列化实体有任何问题,而且持久性无知也不是问题。
这是因为我主要将 PI 用于单元测试。
单元测试是可能的! (我认为)
在这个系统中,我们可以简单地使用模拟服务(例如,通过在另一个基于接口的类中封装对服务的调用,该类可以由工厂生产)。这将测试我们的演示者代码(无需对 EF/DAL 进行单元测试——这是微软的工作!)当然,仍然需要集成测试来获得完全的信心。
如果你想写入一个单独的数据库,这将在 DAL 层完成,通过配置文件很容易实现。
我的塔彭斯价值
我的意见 - 对 EF 做出自己的决定,不要被所有关于它的厄运和悲观所拖累。我猜它会存在一段时间,MS 将在明年左右消除故障。根据 Dan Simmons 的说法,PI 肯定会进来。
编辑:我刚刚意识到我操之过急,就像一个优秀的政治家并没有真正回答所提出的问题。哎呀。但是我会留下这个,以防其他人发现它有用。
【讨论】:
“自己决定”是这个问题的公认答案吗?这是非常慷慨的。 实体的序列化当前已损坏。实体上的 IsReference=True 装饰可防止序列化为 XML 或 JSON。【参考方案4】:并非所有数据模型都能很好地映射到应用程序实体。如果映射不是相对简单,我会跳过实体框架。你会发现自己在做倒立时没有任何明显的好处。
Anders Hejlsberg 有一些关于对象/关系映射 here 的有趣的 cmets。
【讨论】:
【参考方案5】:由于 EF 不支持 POCO,因此很难编写好的单元测试。这是Vote Of No Confidence 中对它的打击之一。
如果你想编写好的测试,EF 会设置障碍。你可以work around them,但这不是小事。
【讨论】:
这个答案已经过时了。 POCO 已经支持一段时间了。【参考方案6】:虽然 SQL CE 3.5 SP1 和 Entity Framework 4.0 Beta 1 都支持标识列,但同时使用这两个产品(至少在列出的版本之前),不支持标识列。您需要自行设置主键。
除此之外,我一直在享受带有 SQL CE 的 EF。
【讨论】:
以上是关于何时不使用实体框架的主要内容,如果未能解决你的问题,请参考以下文章
实体框架 4 Single() vs First() vs FirstOrDefault()
实体框架4单()与第()VS FirstOrDefault()