对DevExpress XPO ORM软件包有任何想法吗?

时间:2020-03-05 18:44:12  来源:igfitidea点击:

XPO是我公司选择的对象关系映射器。对利弊有何看法?

我只是在寻找有关该产品的一般感觉和轶事。我们不会切换到XPO。我们只是摆脱了生活在应用程序中的硬编码sql字符串,并完全转移到ORM进行所有数据访问。

解决方案

回答

与之相比的利弊是什么?那里有很多替代方案,其中最流行的是nHibernate,并且还有新的" ADO.NET实体框架"。

无论如何,取决于情况和要求,有数百种答案。

回答

其他人可能会提出一些技术性的答案(例如查询语法,使用缓存,简化或者以其他方式映射到现有数据库结构)-但是,如果我们已经建立了ORM层,答案可能是

"为什么要改变"?

多年来,我已经成功地将XPO用于具有数百个用户的成熟商业产品中。我发现它快速,灵活且能胜任。我目前没有任何必要更改,因为我们的数据量不是特别大,并且可以解决的问题(主要是缓存)。

如果我是从头开始的话,那么我肯定会同时看一下NHibernate和ADO.NET实体框架。但实际上,一切都很好。在技​​术问题之前,我最有可能查看该项目的商业情况。

例如,NHibernate是开源的-是否有一个可行的社区来支持该工具并提供(如有必要)商业支持?

XPO来自工具供应商,他们是否有可能在产品的整个生命周期内保持业务运营?

ADO.NET实体框架来自Microsoft,Microsoft因经常更改数据库技术而臭名昭著,然后Larry用战斗机燃料为战斗机加油-这也会消失吗?

回答

我喜欢这样的事实,我们可以只创建类,而xpo可以为我们创建表和关系,因此我们可以从空白数据库开始。

我不喜欢的一个问题是,当我想删除一大堆东西时,它将遍历我的收藏集并对其进行删除。这需要很长时间,因此对于这种实例,我不得不编写一些自定义sql(从表中删除等等)。我不是XPO的专家,但这就是我所发现的。

回答

我赞同这样一个事实,即删除具有某些集合的复杂对象的时间确实非常长。到目前为止,文档或者论坛都无法帮助我解决这个问题。

除此之外,它真的很容易使用,并且可以让我们快速入门。

弄清内存使用情况也很困难,我在设计中有复杂的大对象,并且与它们一起工作比我想象的要大。

回答

我发现XPO的使用非常令人沮丧。 ORM的主要思想是抽象出底层的数据结构。但是很快我们会注意到它们的默认字符串长度被硬编码为60个字符,因此最终我们将这些丑陋的string.unlimited内容添加到每个字符串周围。这么多的抽象...

为更复杂的对象建模时,必须使用很多语法,这些语法在对象模型中实际上没有任何位置,例如XPCollection。我想存储一个在类上具有字符串字典的类,但是遗憾的是XPO无法将其自动存储到数据库中。

因此,尽管对于简单类型它可以正常工作,但是当我们要存储更复杂的东西时,它很快就会崩溃。加上他们平庸的支持,确实有很多不足之处。

回答

总体而言,XPO易于使用。但是,当我们计划使用旧数据库或者尝试将其引入Brownfield应用程序时,可能会有些痛苦。我遇到的最痛苦的障碍是:

  • 所有对象都需要从XPO相关的类继承和/或者使用XPO相关的属性。因此,没有POCO对象
  • 不支持只读持久字段OOTB。有可能,但是我们需要做一些修改以阻止XPO更新数据库中的字段
  • 不支持预过滤关联,这可能会导致过多的网络负载
  • 对外键的支持不佳。公平地说,没有ORM能够很好地处理复合键。它们被认为是"反ORM"模式。
  • 几个小烦恼

正如Dennis在评论中指出的那样,自从我最初编写此答案以来,XPO有了很大的改进。特别是,下面的事情不再是问题:

  • 由于没有序列化,因此XPO对象很难在非赢取的Win Forms场景中使用,数据通过Web服务来传递。 -XPO现在支持各种序列化方案,并且可以轻松地与WCF一起使用。
  • 我们无法使用自己的临时表进行多对多关系映射。 Xpo希望为此类临时表指定特定的名称。 -不再是这种情况
  • postgreSql提供程序中不支持枚举-我们只需要编写非常简单的值转换器,就可以了。

同样,以下问题将不再是今年晚些时候发布的下一版XPO的问题:

  • 不支持long类型的键
  • postrgeSql提供程序中不支持数据库模式

总而言之,XPO得到了极大的改进。大多数痛苦的障碍都被清除了。在使用旧版数据库时,我们仍然会遇到问题。但总的来说,XPO变得相当方便使用。

回答

我已经使用它6-7个月了,对我来说,卖家是一个事实,即他们的所有UI组件均可与XPO相对无缝地工作,并且其UI组件是一流的。

某些人可能会注意到,他们的论坛没有得到很好的监控,几乎没有有用的流量,这是事实。秘诀是尽管要填票。他们快速,准确地响应了所有支持请求。

回答

这就是开始编写域对象所需要做的全部工作(在其他系统中尝试相同的操作):

using System;
using DevExpress.Xpo;
using DevExpress.Data.Filtering;
using NUnit.Framework;

namespace XpoTdd {
    public class Person:XPObject {
        public Person(Session session) : base(session) { }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        [Persistent]
        public string FullName { get { return FirstName + " " + LastName; } }
    }
    [TestFixture]
    public class PersonTests {
        [Test]
        public void TestPersistence() {
            const string connStr = "Integrated Security=SSPI;Pooling=false;Data Source=(local);Initial Catalog=XpoTddTest";
            UnitOfWork session1 = new UnitOfWork();
            session1.ConnectionString = connStr;
            Person me = new Person(session1);
            me.FirstName = "Roman";
            me.LastName = "Eremin";
            session1.CommitChanges();
            UnitOfWork session2 = new UnitOfWork();
            session2.ConnectionString = connStr;
            me = session2.FindObject<Person>(CriteriaOperator.Parse("FullName = 'Roman Eremin'"));
            Assert.AreEqual("Roman Eremin", me.FullName);
        }
    }
}

回答

XPO版本10.2现在同时支持StoredProcedures和SqlQueries。查看信息
这里...