代码之家  ›  专栏  ›  技术社区  ›  em70

ORM/持久层建议

  •  26
  • em70  · 技术社区  · 15 年前

    我正在开始一个新的项目,我正在寻找一个非常好的or m或者一个非基于sql的持久层。
    对于这个项目,我真的不关心数据是如何持久化的,只要它能够以合理的速度被查询和存储,最重要的是通过简单的查询。
    并发性应该被无缝地处理(前端将在另一层,同时会有几个用户,虽然不一定要处理同一个数据),我越不必关注数据层(简单查询、自动延迟加载等),越好。
    我还想不惜一切代价避免处理基于字符串的查询,这样支持linq或其他直观的、可能是强类型查询的工具就得到了很大的好处。
    最后使用poco对象是我真正想做的另一件事
    以下是我评估过的产品列表以及它们不适合的原因,这样我就看不到任何关于使用这些产品的建议:

    • nhibernate:疯狂的xml内容,过多的设置,高维护复杂性和模型更改成本,会话工厂很混乱,不适合我的需要
    • castle activerecord:基于nhibernate的,很少的文档加上一些与nhibernate相关的问题仍然适用。此外,要获得合适的模型,需要很多属性,因此最好手动创建模式,处理关系的方式令人遗憾。
    • linq to sql:缺少poco对象,根据ms的说法,这不会增加太多时间(ef是它们的承诺)
    • 实体框架:虽然在v4中poco对象是可能的,但它们仍然相当老套,迫使您做太多的手工工作来设置。另外,v4只是一个测试版
    • llblgen-pro:很好,特别是使用自服务适配器,但不是poco。而且,linq提供者还不是完美的。最后,通过linq删除一组对象是不可能的,这会导致api的混合(其中一个远远不是直观的),我不喜欢。
    • xpo:除了直观的、非常慢的、并发问题之外的任何东西,而不是poco
    • 亚音速简化假设:有几分钟我以为我在做梦。当我发现事情是如何处理人际关系的时,deam结束了。

    我也研究过mongodb和couchdb,但是在这些情况下,相关对象的捕获看起来需要进行太多的测试才能使事情变得正确。此外,它们都不提供强类型查询。

    提前谢谢你的建议!

    11 回复  |  直到 10 年前
        1
  •  7
  •   Meligy    10 年前

    如果你买得起llblgen许可证,就去拿吧。

    我真的不喜欢使用linq查询语法越多(尽管我喜欢与之相关的语言特性,如扩展方法和表达式树)。

    起初我和其他人一样喜欢它,但我不确定xyz linq提供程序中的[where employee.name.startswith(“john smit”)]]是在sql语句中完成的还是在linq to objects中完成的(在sql返回所有结果之后),以及[user.roles.contains(role)]]是否能正常工作。落后了一大步。

    llblgen可以使删除所有项而不必加载它们变得像

    MyEntityCollection.DeleteAll( new MyEntity {Condition = value} );
    

    这很简单,我喜欢。您将得到延迟加载,并在默认情况下和/或使用预取api为每个查询设置紧急/深度加载。您可以在无限级别上动态(并且容易地)组合和构造任何过滤器/排序/加载。非常好。

    关于llblgen,只有两个问题:第一,这是不是所有公司都愿意付出的代价,尤其是考虑到微软替代品的大肆宣传。第二,命名约定虽然是rdbms理论中的标准)比如谓词,而不是“where”或“filter”和预取,而不是深度加载,甚至是sortexpression,而不是orderby,这些对于第一次使用它的开发人员来说都有点可怕,但是很快你就会明白为了爱他们,给予他们力量和安逸。有关于llblgen 3.0中poco支持的讨论。我不能告诉你因为我不知道。

    现在,鉴于我不再在使用llblgen的公司工作,该公司使用linq-to-sql主要是因为它在许多项目中“被证明”没有大的失败(与ef 1不同,ef1在linq-to-sql中甚至缺少linq特性,性能非常差,在高级映射中可能会受到很大限制-这应该是最好的!)。我在这家公司里用过这两个词,而且都讨厌。新项目的决策仍然依赖于sql,并且尽我们所能克服它的局限性。这个网站stackoverflow本身运行在它上面!!!!您可以绕过它来做半poco(当涉及到关联时,仍然需要使用一些与l2s相关的类型)。

    我也在家做一些小项目。由于我不再拥有llblgen许可证,我决定学习nhibernate,并与流利的nhibernate和linq一起使用nhibernate。我从中了解到,尼伯纳是非常强大的。它通过一些功能改变了我的工作方式,比如自动更新数据库模式(使用它时我几乎从未接触过d)。linq provider(在nhibernate-contrib项目中)有时非常缺乏,但是nhibernate本身的未发布源代码包含了一个更好的linq provider(还没有尝试过)。nhibernate中的“session”在进行类似于l2s中的datacontext或ef中的objectcontext的web开发时有问题(llblgen不会因为自我跟踪实体而受到影响)。

    不过,我和nhibernate之间最大的问题是找到信息的能力。太多的部分应该以某种方式组合在一起,而没有太多的指导可以包括用于映射和查询的高级信息。如果我没有一个朋友(tuna toksoz,@tehlike在twitter上)碰巧是nhibernate项目源代码的提交者,我真的会遇到严重的麻烦。

    我学到的寓意是:如果你想要的东西只是工作和一点基本的使用LINQ到SQL或亚音速,如果你想要中间的东西,并且你的生产环境可以负担得起beta.net版本(考虑到GoLive的存在)使用Entity Framework 4.0,如果你想要的东西非常强大并且可以福特的努力学习过程去了nhibernate,最重要的是,如果你能负担得起llblgen,使用它。

        2
  •  6
  •   Alex Kofman    15 年前

    看一看 DataObjects.Net :

    优势:

    • 使用简单的类和属性轻松设计业务模型
    • 数据库模式是在运行时自动生成的,因此您不必关心数据是如何持久化的
    • 自动延迟加载、透明持久性等…
    • 非常好的linq实现
    • 高性能

    缺点:

    • 不是POCO
        3
  •  4
  •   Andriy Volkov    15 年前

    恕我直言,我倾向于完全不同意你对NHibernate弱点的评价。

    我认为创建xml映射非常简单和直观。 添加对nhibernate.dll的引用并创建sessionfactory也是小菜一碟。 大大简化了维护和更改管理。 会话工厂和会话非常容易理解和处理。

    总的来说,我认为你是情绪化的,对你的评估不理性。

        4
  •  3
  •   M4N    15 年前

    您是否考虑过使用面向对象的数据库,如 db4o . 虽然我从来没有用过,但当我发现它时,我觉得它很有趣:

    它支持linq查询,使用poco,如果我理解正确,数据只存储在一个文件中(不需要安装数据库)。

    一些链接: tutorial , forum post

        5
  •  2
  •   Baldy    15 年前

    勒布尔根

    如果你认为你会找到什么东西,勾你所有的盒子,那么你可能会等待很长一段时间。

        6
  •  2
  •   this. __curious_geek    15 年前

    编写自己的orm

    听起来可能很疯狂,但你可以自己写orm。在某个项目中,客户不想使用第三方工具或库,因此,我们最终编写了自己的orm,为我们提供了特定的目标。您可以用属性来修饰对象的类和属性,以便将它们与数据库表和字段映射。拥有所有业务对象的基类,并使用反射对对象执行数据库操作。

    这样你就可以建立自己的小ORM来满足你的特定目标。作为参考,它可能有点像这样。

    [TableMapping("Users", "User", "Users")]
    public class User : EntityBase
    {
        #region Constructor(s)
        public User()
        {
        }
        #endregion
    
        #region Properties
    
        #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute
    
        private System.Int32 _UserId;
    
        private System.String _UserName;
    
        [DataFieldMapping("UserID")]
        [DataObjectFieldAttribute(true, true, false)]
        [NotNullOrEmpty(Message = "UserID Is Required.")]
        public override int Id
        {
            get
            {
                return _UserId;
            }
            set
            {
                _UserId = value;
            }
        }
    
        [DataFieldMapping("UserName")]
        [NotNullOrEmpty(Message = "Username Is Required.")]
        public string UserName
        {
            get
            {
                return _UserName;
            }
            set
            {
                _UserName = value;
            }
        }
    
        #endregion
    
        #region One-To-Many Mappings
        #endregion
    
        #region Derived Properties
        #endregion
    
        #endregion
    }
    
        7
  •  2
  •   Chris Holmes    15 年前

    我使用了llblgenpro、nhibernate和一些对象数据库。

    我的第一个建议是使用nhibernate和fluentnhibernate来处理映射。

    我发现90%与使用nhibernate相关的困难都与xml映射直接相关。当我换上氟尼氨酸时,疼痛消失了。

    另外10%的困难只是无知,我不明白。这不是尼伯内特的错。

    llblgenpro:我不知道linq支持现在是什么样子,但是在linq被支持之前,编写查询是一个pita。我读了这些文档,得到了它,但我的同事没有,并且没完没了地抱怨预取路径等的复杂性。另外,就像你说的-不是波科。再加上成本,我想这比它的价值要麻烦得多。

    如果不是客户机-服务器体系结构,我建议使用db40。我把它用在一个小型的私人项目上,我喜欢它。使用方便。伟大的小对象数据库。

        8
  •  1
  •   Ron Klein Noa Kuperberg    15 年前

    看一看 EntitySpaces . 我不能从我个人的经验中推荐,但它对我的一个同事(他不喜欢sof…)很有用。

        9
  •  1
  •   Fredy    15 年前

    看看aspectize here

        10
  •  1
  •   automatic    15 年前

    对我来说,答案是llblgen pro。除了它的功能外,您还可以获得一个专门的支持团队,该团队关心如何帮助您使项目正常工作,如果您发现一个bug,在大多数情况下,您将在数小时或数天内得到修复。这不能最小化,因为它允许您继续工作,而不是等待发布(几个月?)或者你自己去修理虫子。

        11
  •  1
  •   Terence    15 年前

    你可以看看 Telerik ORM . 我还没有在生产中使用它,但是它是基于一个叫诗人的Java ORM \ODB,几年前我工作的很好。由于它使用了组装增强功能,因此它提供了比您上面拒绝的一些产品更透明的体验。

    就纯odb而言 FastObjects by Versant 可能值得一看。

    祝你好运-让我们知道你决定怎么做。