.net ORM比较

.net ORM比较,.net,orm,comparison,.net,Orm,Comparison,我和某人讨论了实体框架,我还不是很喜欢它,但我想学习它。然而,我仍然有点困惑我是否应该学习它。我听到很多人说你不应该使用实体框架,但是我没有听到任何关于为什么会这样的争论 所以我的问题是,使用实体框架的利弊是什么。像 亚硝酸铵 DataObjects.Net 等等 在易用性、可测试性、语义方面 我知道这里面有一些。但它们都有点过时(20082009),老实说,这些论点也缺少一些东西。我知道EntityFramework4.0是可用的,但我还没有找到一个好的(完整的)比较 答案 这里的一些好

我和某人讨论了实体框架,我还不是很喜欢它,但我想学习它。然而,我仍然有点困惑我是否应该学习它。我听到很多人说你不应该使用实体框架,但是我没有听到任何关于为什么会这样的争论

所以我的问题是,使用实体框架的利弊是什么。像

  • 亚硝酸铵
  • DataObjects.Net
  • 等等
在易用性、可测试性、语义方面

我知道这里面有一些。但它们都有点过时(20082009),老实说,这些论点也缺少一些东西。我知道EntityFramework4.0是可用的,但我还没有找到一个好的(完整的)比较


答案 这里的一些好人通过解释不同框架的一些细节回答了我的问题。我想最好在这里展示一下,以备将来参考


    • 希望这些都能有所帮助


      我花了大量的时间使实体框架适应我的需要,因此可以说,它满足了您希望从ORM获得的大部分需求。但是有些方面太复杂了,因为其他的orm已经表明它可以变得更简单

      例如,开始使用实体框架相当容易,因为您可以在VisualStudio中启动设计器,并在几分钟内创建一个工作的ORM。但最终您会得到与设计器创建的ObjectContext关联的实体类(使用自定义T4模板可以避免这种情况)。这不一定是件坏事,但这是Microsoft的“入门”方法,您不希望在实际应用程序中使用这种方法

      但是,如果您深入了解实体框架,您会发现如何避免大部分陷阱:设计器生成一个EDMX文件,它(如果您在XML编辑器中查看)只不过是ORM的三个主要方面的组合,即物理存储(您的数据库)、概念模型(您的实体类)以及两者之间的映射。Visual Studio中应用于.edmx文件的自定义生成操作将把这三个部分拆分为三个单独的文件,并将它们作为嵌入资源添加到程序集中。创建ObjectContext时,这三个文件的路径在ConnectionString中使用(我总是觉得有点困惑)。你在这里能做的,就是自己做这一切。这意味着在XML编辑器(非常类似于NHibernate)中编写存储模式、概念模型和映射,并将它们嵌入包含模型的程序集

      基本实体框架基类“ObjectContext”可以从这三个文件构造(它使用MetadataWorkspace和EntityConnection),但关键是,您可以完全控制ObjectContext的创建方式。这为实体框架提供了许多您可能无法期望的功能。例如:您可以在同一程序集中嵌入多个SSDL存储模式,以匹配特定的数据库类型(我通常为SQL Server添加一个,为SQL Server CE 4.0添加一个)。并创建一个构造函数重载,为特定类型的数据库连接选择合适的存储模式

      由于您现在有自己的ObjectContext实现,因此可以在其上实现各种接口。就像您自己的IRepository,但由于我喜欢ObjectContext方法,我创建了如下内容:

      interface ICatalog
      {
          IEntitySet<Article> { get; }
          void Save();
      }
      
      interface IEntitySet<T> : IQueryable<T>
      {
          void Add(T);
          void Remove(T); 
      }
      
      class EntityFrameworkCatalog : ICatalog
      {
          ...
      }
      
      尽管EF现在可以从存储器返回这些序列化文档,并将它们写入存储器,但需要拦截文章的存储,并将简单文档替换为EntityFrameworkDocument one,以确保EF可以对其进行序列化。我相信其他ORM很容易做到这一点,而且情况会变得更糟。目前,没有办法对System.Uri类(不可变,但在其他情况下可以工作)或枚举执行相同的操作。除了这些限制外,您还可以使EF满足您的大多数需求。但是你会花很多时间在上面(就像我一样)

      由于我对其他ORM的经验有限,我将总结如下:

      • 实体框架在GAC中,甚至在客户端概要文件中
      • 可以自定义实体框架来表示甚至复杂的实体类型(包括一些自引用的多对多,例如,或上面的XML序列化)
      • 它可以被“抽象”掉,所以你可以坚持IRepository等
      • IQueryable实现(尽管它没有DataObjects.Net那么完整)
      • 它只需要System.Data和System.Data.Entity,您甚至可以为通常需要引用的其他提供程序包含多个存储架构,但如果您坚持使用DbConnection,则可以执行以下操作:

        ICatalog创建(DbConnection连接,string-storageSchemaPath) ICatalog CreateMySql(数据库连接mySqlConnection) { 返回创建(连接)res://Assembly/Path.To.Embedded.MySql.Storage.ssdl"); }

      编辑
      我最近发现,如果您的实体和“catalog”实现位于同一个程序集中,那么您可以为XML序列化过程使用内部属性。因此,您可以将名为
      Xml
      的内部属性添加到
      Document
      类本身,而不是从
      Document
      派生内部
      EntityFrameworkDocument
      。这仍然只适用于对实体拥有完全控制权的情况,但它不需要截取对目录的任何更改,以确保使用派生类。CSDL看起来是一样的,EF只允许映射属性是内部的。我仍然必须确保这在中等信任环境中起作用。

      由于J.Tihon在解释EF特性方面做得很好,我只列出NHibernate围绕EF运行的领域:

      • 缓存
        • 英孚拥有
           class Document : IXmlSerializable { }
           class Article
           {
               public virtual Document Content { get; set; }
           }
           internal class EntityFrameworkDocument : Document
           {
               public string Xml
               {
                   get
                   {
                        // Use XmlSerializer to generate the XML-string for this instance.
                   }
                   set
                   {
                        // Use XmlSerializer to read the XML-string for this instance.
                   }
               }
           }