<p><a href="http://www.devexpress.com/Products/NET/ORM/" rel="noreferrer">XPO</a> is the object relational mapper of choice at my company. Any thoughts on the pros and cons?</p>

<hr>

<p>I was just looking for general feeling and anecdotes about the product. We are not switching to XPO. We are just getting rid of hard coded sql strings living in the app and moving completely to ORM for all data access.</p>

[{'answer_id': 31862, 'author': 'Nicholas', 'author_id': 2658, 'author_profile': 'https://Stackoverflow.com/users/2658', 'pm_score': 0, 'selected': False, 'text': "<p>The pros and cons compared to what? There are a lot of alternatives out there, the most popular being nHibernate, with the new kid 'ADO.NET Entity Framework' on the block.</p>\n\n<p>Anyways, there are hundreds of answers depending on your situation and requirements.</p>\n"}, {'answer_id': 35302, 'author': 'Jeremy McGee', 'author_id': 3546, 'author_profile': 'https://Stackoverflow.com/users/3546', 'pm_score': 4, 'selected': False, 'text': '<p>Others will probably pitch in with technical answers (e.g. the query syntax, use of caching, ease or otherwise of mapping to an existing database structure) -- but if you have an established ORM layer the answer is probably </p>\n\n<p>"Why change"?</p>\n\n<p>I\'ve used XPO successfully for years in an established commercial product with several hundred users. I find that it\'s fast, flexible and does the job. I don\'t see any need to change at the moment, as our data volumes aren\'t particularly large and the foibles (caching, mostly) are things we can work around. </p>\n\n<p>If I were starting afresh I\'d definitely look at both NHibernate and the ADO.NET Entity Framework. In practice, though, all are good; I\'d most likely look at the commercial situation for the project ahead of the technical questions. </p>\n\n<p>For instance, NHibernate is open-source -- is there a viable community there to support the tool and to provide (if necessary) commercial support? </p>\n\n<p>XPO comes from a tools vendor, are they likely to remain in business for the lifetime of the product? </p>\n\n<p>ADO.NET Entity Framework comes from Microsoft, who are notorious for changing database technologies more often then Larry fills his fighter with jet fuel -- will this, too, fade away?</p>\n'}, {'answer_id': 49417, 'author': 'Dave Arkell', 'author_id': 4002, 'author_profile': 'https://Stackoverflow.com/users/4002', 'pm_score': 0, 'selected': False, 'text': "<p>I like the fact that you can just create classes, and xpo creates the tables and relationships for you - so you can start from a blank database.</p>\n\n<p>One issue I don't like is when I want to delete a whole bunch of stuff, it will go through my collection and do a delete on each one.  This takes ages, so for this kind of instance, I've had to write some custom sql (delete from table where blah).  I'm no expert on XPO, but that's what I found.</p>\n"}, {'answer_id': 166781, 'author': 'Tomas Pajonk', 'author_id': 4694, 'author_profile': 'https://Stackoverflow.com/users/4694', 'pm_score': 0, 'selected': False, 'text': '<p>I second the fact the deleting complex objects with some collections take really, really long. So far the documentation or the forums were not able to help me with this. </p>\n\n<p>Apart from that it is really simple to use and gets you going quickly. </p>\n\n<p>It is also quite hard to figure out your memory usage, I had complex big objects in my design and working with them was a memory hog bigger than I had assumed. </p>\n'}, {'answer_id': 237288, 'author': 'Anders Rune Jensen', 'author_id': 13995, 'author_profile': 'https://Stackoverflow.com/users/13995', 'pm_score': 4, 'selected': False, 'text': "<p>I have found XPO very frustrating to work with. The main idea of an ORM is to abstract away the underlying data structure. But very quickly you'll notice that they have the default string length hardcoded to 60 chars, so you end up adding these ugly string.unlimited things around every string. So much for abstraction...</p>\n\n<p>When modelling more complex object you have to use a lot of syntax that really has no place in your object model, like XPCollection. I wanted to store a class which had a dictionary of strings on the class, but sadly XPO was not able to automatically store this into the database.</p>\n\n<p>So while it works ok for simple types, it very quickly breaks down when you want to store more complex things. That combined with their mediocre support really leaves a LOT to be desired.</p>\n"}, {'answer_id': 1104720, 'author': 'Przemaas', 'author_id': 135646, 'author_profile': 'https://Stackoverflow.com/users/135646', 'pm_score': 2, 'selected': False, 'text': '<p>XPO in overall is easy to work with. However, it can be a little pain when you plan to work with legacy database or try to introduce it into a brownfield app. Most painful obstacles I hit were:</p>\n\n<ul>\n<li>all objects need to inherit from XPO related classes and/or use XPO related attributes. So, no POCO objects</li>\n<li>no support for readonly persistent fields OOTB. It\'s possible, but you need to do a little hacking to stop XPO from updating field in DB</li>\n<li>no support for pre filtering associations, which can cause excessive network load</li>\n<li>Poor support for foreign composite keys. To be fair, no ORM handles composite keys nicely. They are considered to be "anti-ORM" pattern. </li>\n<li>few small annoyances</li>\n</ul>\n\n<p>As Dennis pointed out in comments, XPO was greatly improved since I wrote this answer originally. In particular, below things are no longer an issue:</p>\n\n<ul>\n<li>no serialization, so XPO objects are hard to use in disconected win forms scenario, with data coming through web services. - XPO supports now various serialization scenarios and can be easily used with WCF.</li>\n<li>you cannot do many-to-many relation mapping with your own interim table. Xpo wants specific name for such interim tables. - This is no longer a case</li>\n<li>no support for enums in postgreSql provider - You just need to write really simple value converter and you are good. </li>\n</ul>\n\n<p>Also, below issues will no longer be problem with next XPO release, coming later this year:</p>\n\n<ul>\n<li>no support for keys of type long</li>\n<li>no support for db schema in postrgeSql provider</li>\n</ul>\n\n<p>All in all, XPO was greatly improved. Most painfull obstacles were removed. You can still hit problems while working with legacy DB. But in general XPO became quite convenient to use.</p>\n'}, {'answer_id': 1169681, 'author': 'Steven Evers', 'author_id': 48553, 'author_profile': 'https://Stackoverflow.com/users/48553', 'pm_score': 3, 'selected': False, 'text': "<p>I've been working with it for 6-7 months now and the seller for me was the fact that all of their UI components work relatively seamlessly with XPO - and their UI components are top notch.</p>\n\n<p>Some might note that their forums are poorly monitored and have little useful traffic - this is true. The secret is to fill out tickets though. They respond quickly, and accurately to all of their support tickets.</p>\n"}, {'answer_id': 2686616, 'author': 'Roman Eremin', 'author_id': 318097, 'author_profile': 'https://Stackoverflow.com/users/318097', 'pm_score': 0, 'selected': False, 'text': '<p>This is all you need to do to start writing your domain objects (try do the same in other systems):</p>\n\n<pre><code>using System;\nusing DevExpress.Xpo;\nusing DevExpress.Data.Filtering;\nusing NUnit.Framework;\n\nnamespace XpoTdd {\n    public class Person:XPObject {\n        public Person(Session session) : base(session) { }\n        public string FirstName { get; set; }\n        public string LastName { get; set; }\n        [Persistent]\n        public string FullName { get { return FirstName + " " + LastName; } }\n    }\n    [TestFixture]\n    public class PersonTests {\n        [Test]\n        public void TestPersistence() {\n            const string connStr = "Integrated Security=SSPI;Pooling=false;Data Source=(local);Initial Catalog=XpoTddTest";\n            UnitOfWork session1 = new UnitOfWork();\n            session1.ConnectionString = connStr;\n            Person me = new Person(session1);\n            me.FirstName = "Roman";\n            me.LastName = "Eremin";\n            session1.CommitChanges();\n            UnitOfWork session2 = new UnitOfWork();\n            session2.ConnectionString = connStr;\n            me = session2.FindObject&lt;Person&gt;(CriteriaOperator.Parse("FullName = \'Roman Eremin\'"));\n            Assert.AreEqual("Roman Eremin", me.FullName);\n        }\n    }\n}\n</code></pre>\n'}, {'answer_id': 4497416, 'author': 'Reverove Likia', 'author_id': 549646, 'author_profile': 'https://Stackoverflow.com/users/549646', 'pm_score': 2, 'selected': False, 'text': '<p>XPO ver 10.2 now supports for both StoredProcedures and SqlQueries. See infomation \n<a href="http://devexpress.com/Subscriptions/DXperience/WhatsNew2010v2/index.xml?page=55" rel="nofollow">here</a>...</p>\n'}]
['https://Stackoverflow.com/questions/31559', 'https://Stackoverflow.com', 'https://Stackoverflow.com/users/1455/']