是我公司选择的对象关系映射器。任何关于利弊的想法?关于DevExpress XPO ORM包的任何想法?
我只是在寻找关于产品的一般感受和轶事。我们不会切换到XPO。我们正在摆脱生活在应用程序中的硬编码的SQL字符串,并完全移到ORM以获取所有数据访问权限。
是我公司选择的对象关系映射器。任何关于利弊的想法?关于DevExpress XPO ORM包的任何想法?
我只是在寻找关于产品的一般感受和轶事。我们不会切换到XPO。我们正在摆脱生活在应用程序中的硬编码的SQL字符串,并完全移到ORM以获取所有数据访问权限。
比较哪些优缺点?这里有很多其他的选择,最受欢迎的是nHibernate,在这个块上有新的孩子“ADO.NET Entity Framework”。
无论如何,根据您的情况和要求,有数百个答案。
其他人可能会在场上用技术解答(如查询语法,使用缓存,缓解或以其他方式映射到现有的数据库结构) - 但如果你有一个既定的ORM层的答案可能是
“为什么要改变”?
我已经在几百名用户的成熟商业产品中成功使用了XPO多年。我发现它快速,灵活并且完成这项工作。由于我们的数据量并不是特别大,而且我们可以解决这些问题(主要是缓存),所以目前看不出有什么需要改变。
如果我重新开始我肯定会看NHibernate和ADO.NET实体框架。但实际上,一切都很好;我很可能会在技术问题之前查看项目的商业情况。例如,NHibernate是开源的 - 那里有一个可行的社区来支持该工具并提供(如果有必要)商业支持吗?
XPO来自工具供应商,它们是否可能在产品的整个生命周期内保持业务?
ADO.NET实体框架来自微软,他们经常更改数据库技术,然后拉里用喷气燃料填充他的战斗机 - 这也会消失吗?
我喜欢你可以创建类的事实,而xpo为你创建表和关系 - 所以你可以从一个空白数据库开始。
我不喜欢的一个问题是,当我想删除一大堆东西时,它会通过我的收藏夹并在每个收藏夹上进行删除。这需要很长的时间,所以对于这种类型的实例,我不得不写一些自定义的sql(从表中删除等等)。我不是XPO方面的专家,但这就是我发现的。
这也可以用NHibernate和EF完成:它的被称为代码优先的方法。 – 2017-07-27 10:24:10
我第二个事实是删除复杂的对象与一些集合真的很长。到目前为止,文档或论坛都无法帮助我解决这个问题。
除此之外,它使用起来非常简单,可以让您快速上手。
要弄清楚你的内存使用情况也很困难,我在设计中遇到了复杂的大对象,并且与它们一起工作的内存比我想象的要大。
我发现XPO非常令人沮丧的工作。 ORM的主要思想是抽象出底层的数据结构。但很快你会注意到他们的默认字符串长度已经硬编码为60个字符,所以你最终会在每个字符串周围添加这些难看的字符串。如此多的抽象...
当建模更复杂的对象时,你必须使用很多语法,在你的对象模型中没有任何位置,比如XPCollection。我想存储一个有类字典字典的类,但很遗憾,XPO无法自动将它存储到数据库中。
因此,虽然它适用于简单类型,但当您想要存储更复杂的事物时,它会很快崩溃。这与他们平庸的支持相结合确实留下了很多希望。
我在上一份工作上使用了他们多年,虽然不是为了xpo,并且总是发现他们的支持很出色。始终提交错误或功能请求,并且它们都很快响应。这些错误被迅速修复,并且他们没有任何问题给我提供了一个包含修复程序的夜间预发布链接。我所有关于如何使用它的问题也可以通过示例代码快速回答。我为提交质量问题做了大量努力,所以也许这就是原因。认为在这些年中只有一个问题被标记为重复。伟大的公司与国际海事组织合作。 – 2011-08-19 11:59:50
默认情况下,字符串属性被映射到大小为100的列。以任何方式,您都可以通过静态SizeAttribute.DefaultStringMappingFieldSize属性轻松更改默认大小(它只需要执行一次)。另外,可以通过用SizeAtrribute标记它们来控制各个属性的大小,例如, C#中的[Size(255)]。更多细节可以在http://documentation.devexpress.com/#XPO/clsDevExpressXpoSizeAttributetopic找到 最后,你甚至可以指定一个属性是通过DBTypeAttribute映射成一列的数据库类型,例如[DbType之(“SMALLDATETIME “)] – 2011-08-21 13:56:28
至于存储自定义复杂类型,我怀疑其他ORM是否有内置的支持。开箱即用的XPO能够坚持常用和最常用的类型,*通过价值转换器的机制提供*存储*任何自定义类型*的能力。例如,ImageValueConverter和UtcDateTimeConverter就是这种值转换器的例子。实现自定义值转换器非常简单,因为您必须仅实现两种方法。进一步的细节可以在http://documentation.devexpress.com/#XPO/clsDevExpressXpoMetadataValueConvertertopic – 2011-08-21 14:06:38
XPO总体上很容易使用。但是,当您计划使用旧版数据库或尝试将其引入到棕地应用程序时,可能会有点痛苦。我遇到的最痛苦的障碍是:
丹尼斯在评论中指出,XPO大大因为我最初写这个答案改善。特别是,下面的事情都不再是问题:
此外,下面的问题将不再与下一个XPO版本问题,后来来了今年:
总而言之,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。查看信息 here ...
有关XPO如何处理带有(join,...)的简单自定义SQL命令的任何想法,或者如何使用存储过程? – bmustata 2010-11-04 14:54:42