对 DevExpress XPO ORM 包有任何想法吗? [关闭]

Posted

技术标签:

【中文标题】对 DevExpress XPO ORM 包有任何想法吗? [关闭]【英文标题】:Any thoughts on DevExpress XPO ORM Package? [closed] 【发布时间】:2010-09-07 02:09:19 【问题描述】:

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


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

【问题讨论】:

关于 XPO 如何使用 (join, ...) 处理简单的自定义 SQL 命令或如何使用存储过程的任何想法? 整个 DevExpress 就是垃圾:充满了错误、缓慢、不直观。 【参考方案1】:

其他人可能会提供技术答案(例如查询语法、缓存的使用、映射到现有数据库结构的简便性或其他方式)——但如果您有一个已建立的 ORM 层,答案可能是

“为什么要改变”?

多年来,我在一个拥有数百名用户的成熟商业产品中成功使用了 XPO。我发现它快速、灵活并且可以胜任。目前我认为没有任何改变的必要,因为我们的数据量不是特别大,而且我们可以解决的问题(主要是缓存)。

如果我重新开始,我肯定会同时研究 NHibernate 和 ADO.NET Entity Framework。但实际上,一切都很好。我很可能会在技术问题之前查看该项目的商业情况。

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

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

ADO.NET Entity Framework 来自 Microsoft,该公司因更改数据库技术而臭名昭著,然后 Larry 为他的战斗机注入喷气燃料——这也会消失吗?

【讨论】:

【参考方案2】:

我发现 XPO 非常令人沮丧。 ORM 的主要思想是抽象出底层数据结构。但是很快你就会注意到它们的默认字符串长度硬编码为 60 个字符,所以你最终会在每个字符串周围添加这些丑陋的 string.unlimited 东西。抽象的东西太多了……

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

因此,虽然它适用于简单类型,但当您想要存储更复杂的东西时,它很快就会崩溃。再加上他们平庸的支持,确实有很多不足之处。

【讨论】:

我在上一份工作中使用了它们多年,虽然不是用于 xpo,但我总是发现它们的支持非常出色。一直提交错误或功能请求,并且它们都得到了非常迅速的响应。这些错误被快速修复,他们给我一个包含修复的预发布夜间链接没有问题。我所有关于如何使用它的问题也得到了同样快的回答,通常是示例代码。我付出了很大的努力来提交质量问题,所以也许这就是原因。认为这些年来只有一个问题被标记为重复。与 IMO 合作的好公司。 默认情况下,字符串属性映射到大小为 100 的列。无论如何,您可以通过静态 SizeAttribute.DefaultStringMappingFieldSize 属性轻松更改默认大小(只需执行一次)。此外,您可以通过使用 SizeAtrribute 标记单个属性来控制它们的大小,例如C# 中的 [大小(255)]。更多细节可以在documentation.devexpress.com/#XPO/…找到最后,您甚至可以通过 DBTypeAttribute 指定属性映射到的列的数据库类型,例如 [DbType("smalldatetime")] 至于存储自定义复杂类型,我怀疑其他 ORM 对此是否有内置支持。开箱即用的 XPO 能够保持常见和最常用的类型,并提供通过值转换器机制存储任何自定义类型的能力。例如,ImageValueConverter 和 UtcDateTimeConverter 就是此类值转换器的示例。实现自定义值转换器很容易,因为您只需实现两种方法。更多详细信息请访问documentation.devexpress.com/#XPO/… XPO 很糟糕:我们有很多内存泄漏问题,而且对象的顺序不可靠。远离这个 ORM,使用更成熟的东西,而不是依赖明天或明年可能不在的第三方公司。【参考方案3】:

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

有些人可能会注意到他们的论坛监控不力,有用的流量很少 - 这是真的。秘诀就是填票。他们对所有支持请求做出快速准确的响应。

【讨论】:

而且他们的支持中心网站像悠悠球一样上下起伏...... 是的,如果您想收到DevExpress 代表的快速和有保证的帮助。幸运的是,当论坛和支持中心合并到一个工具(比如 ***)时,它们之间的混淆就会减少。顺便说一句,也可以通过社交网络中的群组传递有关 XPO 和 XAF 的反馈:community.devexpress.com/blogs/eaf/archive/2011/05/06/…【参考方案4】:

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

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

正如丹尼斯在 cmets 中指出的那样,自从我最初写了这个答案以来,XPO 有了很大的改进。特别是,以下事情不再是问题:

没有序列化,因此 XPO 对象很难在断开连接的 win 表单场景中使用,数据来自 Web 服务。 - XPO 现在支持各种序列化场景,可以轻松地与 WCF 一起使用。 您不能使用自己的临时表进行多对多关系映射。 Xpo 需要此类临时表的特定名称。 - 不再是这种情况了 在 postgreSql 提供程序中不支持枚举 - 你只需要编写非常简单的值转换器就可以了。

此外,在今年晚些时候发布的下一个 XPO 版本中,以下问题将不再是问题:

不支持 long 类型的键 postrgeSql 提供程序中不支持 db 架构

总而言之,XPO 得到了极大的改进。大多数痛苦的障碍都被移除了。在使用遗留数据库时,您仍然会遇到问题。但总的来说,XPO 使用起来相当方便。

【讨论】:

考虑到所有其他更常见的数据库支持,postgre 的疑虑是边缘情况。 2错了,继承自XPCustomObject。 3 也仅在您使用生成的字段时适用。 4与ORM的意图相反。 WRT 9,请改用 Jet 提供程序,如果您使用的是 WCF/Web 服务,请自行序列化它。不要误会我的意思,我不是 xpo 传道者;这只是一个糟糕的清单。 >> •不支持 long 类型的键 community.devexpress.com/blogs/xpo/archive/2011/07/28/… >> •不支持预过滤关联 >> • 没有序列化,因此 XPO 对象很难在断开连接的 win 表单场景中使用,数据来自 Web 服务 community.devexpress.com/blogs/garyshort/archive/2010/11/01/…@ 987654323@ >> •许多小烦恼devexpress.com/Products/NET/ORM/whatsnew.xml 如果您在使用 XPO(或任何其他 DevExpress 产品)时遇到任何问题,请随时通过支持中心报告它们从我们的支持团队获得快速帮助:devexpress.com/sc【参考方案5】:

XPO 10.2 版现在支持 StoredProcedures 和 SqlQueries。查看信息 here...

【讨论】:

【参考方案6】:

对比的优缺点是什么?那里有很多替代品,最受欢迎的是 nHibernate,新的孩子“ADO.NET Entity Framework”就在其中。

无论如何,根据您的情况和要求,有数百个答案。

【讨论】:

【参考方案7】:

我喜欢您可以只创建类,而 xpo 会为您创建表和关系的事实 - 这样您就可以从一个空白数据库开始。

我不喜欢的一个问题是,当我想删除一大堆东西时,它会通过我的收藏并删除每一个。这需要很长时间,所以对于这种情况,我不得不编写一些自定义 sql(从表中删除等等)。我不是 XPO 方面的专家,但这就是我发现的。

【讨论】:

这也可以用 NHibernate 和 EF 来完成:它被称为代码优先方法。【参考方案8】:

我同意删除带有一些集合的复杂对象需要非常非常长的时间。到目前为止,文档或论坛无法帮助我解决这个问题。

除此之外,它使用起来非常简单,让您快速上手。

也很难弄清楚你的内存使用情况,我的设计中有复杂的大对象,使用它们比我想象的要大得多。

【讨论】:

【参考方案9】:

这是您开始编写域对象所需要做的一切(尝试在其他系统中执行相同操作):

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);
        
    

【讨论】:

以上是关于对 DevExpress XPO ORM 包有任何想法吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

.NET ORM 更好地支持多线程?

如何产生 XPO 的WCF服务中间层

用xpo实现dc技术的关键点-XPO是如何处理接口类型与真实类型的对应关系的

关于 xpo 修改字段值,提交成功后,却没有保存到数据库中的一个原因。

绑定网格视图内的多列 devexpress 组合框

How to: Use XPO Upcasting in XAF 如何:在 XAF 中使用 XPO 强制转换