XPO - предпочтительный объектно-реляционный преобразователь в моей компании. Есть мысли о плюсах и минусах?
Я просто искал общие впечатления и анекдоты о продукте. Мы не переходим на XPO. Мы просто избавляемся от жестко закодированных строк sql, живущих в приложении, и полностью переходим на ORM для доступа к данным.
Весь DevExpress - просто мусор: полный ошибок, медленный, неинтуитивный.





Плюсы и минусы по сравнению с чем? Есть много альтернатив, самая популярная из которых - nHibernate, с новой детской платформой ADO.NET Entity Framework.
В любом случае, есть сотни ответов в зависимости от вашей ситуации и требований.
Другие, вероятно, предложат технические ответы (например, синтаксис запроса, использование кеширования, простота или иное сопоставление с существующей структурой базы данных), но если у вас есть установленный уровень ORM, ответ, вероятно, будет
«Зачем менять»?
Я успешно использовал XPO в течение многих лет в устоявшемся коммерческом продукте с несколькими сотнями пользователей. Я считаю, что он быстрый, гибкий и выполняет свою работу. В настоящий момент я не вижу необходимости в изменениях, поскольку объемы наших данных не особенно велики, а недостатки (в основном кеширование) - это то, что мы можем решить.
Если бы я начинал заново, я бы определенно посмотрел и на NHibernate, и на ADO.NET Entity Framework. Однако на практике все хорошо; Скорее всего, я бы посмотрел на коммерческую ситуацию по проекту, прежде чем решать технические вопросы.
Например, NHibernate имеет открытый исходный код - есть ли там жизнеспособное сообщество, которое поддержит инструмент и предоставит (при необходимости) коммерческую поддержку?
XPO поступает от поставщика инструментов, вероятно ли, что они останутся в бизнесе на протяжении всего срока службы продукта?
ADO.NET Entity Framework исходит от Microsoft, которая печально известна тем, что меняет технологии баз данных чаще, чем Ларри заправляет свой истребитель реактивным топливом - это тоже исчезнет?
Мне нравится тот факт, что вы можете просто создавать классы, а xpo создает для вас таблицы и отношения - так что вы можете начать с пустой базы данных.
Одна проблема, которая мне не нравится, - это когда я хочу удалить целую кучу вещей, она проходит через мою коллекцию и удаляет каждую из них. На это уходит много времени, поэтому для этого типа экземпляра мне пришлось написать некоторый собственный sql (удалить из таблицы, где бла). Я не специалист по XPO, но вот что я нашел.
Это также можно сделать с помощью NHibernate и EF: это так называемый подход, основанный на коде.
Я поддерживаю тот факт, что удаление сложных объектов из некоторых коллекций занимает очень-очень много времени. Пока документация или форумы не смогли мне в этом помочь.
Кроме того, он действительно прост в использовании и быстро работает.
Также довольно сложно вычислить использование памяти, у меня были сложные большие объекты в моем дизайне, и работа с ними требовала больше памяти, чем я предполагал.
Мне очень неприятно работать с XPO. Основная идея ORM - абстрагироваться от базовой структуры данных. Но очень быстро вы заметите, что у них длина строки по умолчанию жестко запрограммирована на 60 символов, поэтому вы в конечном итоге добавляете эти уродливые строки. Неограниченное количество вещей вокруг каждой строки. Вот вам и абстракция ...
При моделировании более сложных объектов вы должны использовать много синтаксиса, которому действительно нет места в вашей объектной модели, например XPCollection. Я хотел сохранить класс, в котором был словарь строк, но, к сожалению, XPO не смог автоматически сохранить его в базе данных.
Таким образом, хотя он работает нормально для простых типов, он очень быстро выходит из строя, когда вы хотите сохранить более сложные вещи. Это в сочетании с их посредственной поддержкой действительно оставляет желать лучшего.
Я использовал их в течение многих лет на моей последней работе, хотя и не для xpo, и всегда находил их поддержку выдающейся. Постоянно отправляли сообщения об ошибках или запросы функций, и на все они очень быстро отвечали. Ошибки были исправлены быстро, и у них не было проблем с тем, чтобы дать мне ссылку на предварительный выпуск ночного бюллетеня, который содержал исправления. На все мои вопросы о том, как его использовать, также ответили так же быстро, часто с примерами кода. Я приложил большие усилия, чтобы сообщить о проблемах с качеством, так что, может быть, именно поэтому. думаю, только одна проблема была отмечена как дублирующаяся за все эти годы. Отличная компания для работы, ИМО.
По умолчанию свойства строки отображаются в столбец размером 100. В любом случае вы можете легко изменить размер по умолчанию с помощью статического свойства SizeAttribute.DefaultStringMappingFieldSize (это нужно сделать только один раз). Кроме того, вы можете контролировать размер отдельных свойств, отмечая их атрибутом SizeAtrribute, например [Размер (255)] в C#. Более подробную информацию можно найти в documentation.devexpress.com/#XPO/…. Наконец, вы даже можете указать тип базы данных столбца, которому сопоставлено свойство, через DBTypeAttribute, например [DbType ("smalldatetime")]
Что касается хранения пользовательских сложных типов, я сомневаюсь, что другие ORM имеют встроенную поддержку для этого. Готовая к работе система XPO способна сохранять стандартные и наиболее часто используемые типы, а обеспечивает возможность - хранить любой нестандартный тип через механизм преобразователей ценности. Например, ImageValueConverter и UtcDateTimeConverter являются примерами таких преобразователей значений. Реализовать пользовательский преобразователь значений просто, потому что вам нужно реализовать только два метода. Более подробную информацию можно найти на documentation.devexpress.com/#XPO/…
XPO ужасен: у нас много проблем с утечками памяти, и на порядок объектов нельзя полагаться. Держитесь подальше от этой ORM и используйте что-то более устоявшееся, а не полагайтесь на стороннюю компанию, которой может не быть здесь завтра или в следующем году.
С XPO в целом легко работать. Однако это может быть немного больно, когда вы планируете работать с устаревшей базой данных или пытаетесь внедрить ее в приложение для старых объектов. Самыми болезненными препятствиями, с которыми я столкнулся, были:
Как отметил Деннис в комментариях, XPO был значительно улучшен с тех пор, как я изначально написал этот ответ. В частности, следующие вещи больше не являются проблемой:
Кроме того, следующие проблемы больше не будут проблемой со следующим выпуском XPO, который выйдет позже в этом году:
В целом XPO был значительно улучшен. Устранены самые болезненные препятствия. Вы все еще можете столкнуться с проблемами при работе с устаревшей БД. Но в целом XPO пользоваться стало достаточно удобно.
Проблемы postgre - это крайние случаи, учитывая, что все другие, более распространенные, поддерживаются БД. 2 неверно, наследуется от XPCustomObject. 3 также применимо, только если вы используете сгенерированные поля. 4 противоречит цели ORM. WRT 9, используйте вместо этого поставщика Jet и сериализуйте его самостоятельно, если вы используете WCF / веб-службы. Не поймите меня неправильно, я не евангелист xpo; это просто убогий список.
2 не так уж и плохо. Если вы наследуете от XPCustomObject и поместите KeyAttribute в поле типа Int64, вы получите исключение. К сожалению, KeyAttribute работает только с полями Int32 или Guid. 3 применимо к сгенерированным полям - согласовано. Я имею в виду именно эту проблему. Сейчас нет возможности обрабатывать такие поля с помощью XPO. WRT 4 - что вы подразумеваете под «противодействием намерению ORM»? Мне нужно отразить схему моей существующей БД. Я не могу переименовать таблицы, чтобы они соответствовали «замыслу ORM». Мне нужно, чтобы ORM был достаточно гибким, чтобы охватить мои устаревшие сценарии.
Проблемы с PostreSql - крайний случай - согласитесь. Я надеюсь, что провайдеры Xpo для других БД не содержат ошибок и позволяют работать с новейшими функциями этих БД. Вы называете мой список бедным, но все эти проблемы становятся реальными препятствиями, когда вы сталкиваетесь с ними при работе с устаревшими базами данных и Xpo.
>> • все объекты должны быть унаследованы от классов, связанных с XPO - никаких объектов POCO
>> • нет поддержки ключей типа long community.devexpress.com/blogs/xpo/archive/2011/07/28/…
>> • нет поддержки постоянных полей только для чтения documentation.devexpress.com/#XPO/CustomDocument2875
>> • вы не можете выполнить отображение отношения «многие ко многим» с вашей собственной промежуточной таблицей. Xpo хочет конкретное имя для таких промежуточных таблиц.
>> • нет поддержки ассоциаций предварительной фильтрации
>> • нет сериализации, поэтому объекты XPO трудно использовать в сценарии с отказом от форм выигрыша, когда данные поступают через веб-службы community.devexpress.com/blogs/garyshort/archive/2010/11/01/… community.devexpress.com/blogs/xpo/archive/2011/05/17/…
>> • множество мелких неприятностей devexpress.com/Products/NET/ORM/whatsnew.xml Если у вас возникнут какие-либо дополнительные трудности с XPO (или любыми другими продуктами DevExpress), не стесняйтесь сообщать о них через Центр поддержки, чтобы получить быструю помощь от наших Команда поддержки: devexpress.com/sc
>> XPO хорош для небольших новых проектов. Если вы конвертируете старые приложения или хотите сделать что-то большее, чем приложение для нескольких проектов, держитесь от этого подальше. devexpress.com/Products/NET/Application_Framework), платформу приложений .NET для быстрого создания современных бизнес-приложений. Мы также широко используем приложения на основе XPO и XAF внутри компании. Например, наш основной веб-сайт (www.devexpress.com) использует XPO для подключения к БД и BL.
Привет, Деннис! Это правда, что XPO значительно улучшился с тех пор, как я написал этот ответ. Спасибо, что указали на это. Я обновлю свой пост должным образом
>> • нет поддержки ассоциаций предварительной фильтрации, которые могут вызвать чрезмерную нагрузку на сеть. Просто хочу отметить, что это также было рассмотрено в 11.2: devexpress.com/issue=S38236.
Я работаю с ним в течение 6-7 месяцев, и продавец для меня был тот факт, что все их компоненты пользовательского интерфейса относительно без проблем работают с XPO, а их компоненты пользовательского интерфейса на высшем уровне.
Кто-то может заметить, что их форумы плохо отслеживаются и мало полезного трафика - это правда. Секрет в том, чтобы заполнить билеты. Они быстро и точно отвечают на все обращения в службу поддержки.
И их веб-сайт центра поддержки взлетает и опускается, как йойо ...
Да, сейчас лучше использовать Центр поддержки (devexpress.com/Support/Center) вместо форума XPO (community.devexpress.com/forums/163.aspx), если вы хотите получить быструю и гарантированную помощь от представителей DevExpress. К счастью, будет меньше путаницы между форумами и Центром поддержки, когда они будут объединены в один инструмент, а именно StackOverflow. Кстати, также есть возможность передавать отзывы о XPO и XAF через группы в социальных сетях: community.devexpress.com/blogs/eaf/archive/2011/05/06/…
Это все, что вам нужно сделать, чтобы начать писать объекты домена (попробуйте сделать то же самое в других системах):
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. См. Информацию здесь ...
Есть идеи о том, как XPO обрабатывает простую настраиваемую команду SQL с помощью (join, ...) или как работает с процедурами хранилища?