是我公司選擇的對象關係映射器。任何關於利弊的想法?關於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