Есть какие-нибудь мысли о DevExpress XPO ORM Package?

XPO - предпочтительный объектно-реляционный преобразователь в моей компании. Есть мысли о плюсах и минусах?


Я просто искал общие впечатления и анекдоты о продукте. Мы не переходим на XPO. Мы просто избавляемся от жестко закодированных строк sql, живущих в приложении, и полностью переходим на ORM для доступа к данным.

Есть идеи о том, как XPO обрабатывает простую настраиваемую команду SQL с помощью (join, ...) или как работает с процедурами хранилища?

bmustata 04.11.2010 17:54

Весь DevExpress - просто мусор: полный ошибок, медленный, неинтуитивный.

Ivanzinho 29.11.2019 18:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
23
2
13 926
9

Ответы 9

Плюсы и минусы по сравнению с чем? Есть много альтернатив, самая популярная из которых - nHibernate, с новой детской платформой ADO.NET Entity Framework.

В любом случае, есть сотни ответов в зависимости от вашей ситуации и требований.

Другие, вероятно, предложат технические ответы (например, синтаксис запроса, использование кеширования, простота или иное сопоставление с существующей структурой базы данных), но если у вас есть установленный уровень ORM, ответ, вероятно, будет

«Зачем менять»?

Я успешно использовал XPO в течение многих лет в устоявшемся коммерческом продукте с несколькими сотнями пользователей. Я считаю, что он быстрый, гибкий и выполняет свою работу. В настоящий момент я не вижу необходимости в изменениях, поскольку объемы наших данных не особенно велики, а недостатки (в основном кеширование) - это то, что мы можем решить.

Если бы я начинал заново, я бы определенно посмотрел и на NHibernate, и на ADO.NET Entity Framework. Однако на практике все хорошо; Скорее всего, я бы посмотрел на коммерческую ситуацию по проекту, прежде чем решать технические вопросы.

Например, NHibernate имеет открытый исходный код - есть ли там жизнеспособное сообщество, которое поддержит инструмент и предоставит (при необходимости) коммерческую поддержку?

XPO поступает от поставщика инструментов, вероятно ли, что они останутся в бизнесе на протяжении всего срока службы продукта?

ADO.NET Entity Framework исходит от Microsoft, которая печально известна тем, что меняет технологии баз данных чаще, чем Ларри заправляет свой истребитель реактивным топливом - это тоже исчезнет?

Мне нравится тот факт, что вы можете просто создавать классы, а xpo создает для вас таблицы и отношения - так что вы можете начать с пустой базы данных.

Одна проблема, которая мне не нравится, - это когда я хочу удалить целую кучу вещей, она проходит через мою коллекцию и удаляет каждую из них. На это уходит много времени, поэтому для этого типа экземпляра мне пришлось написать некоторый собственный sql (удалить из таблицы, где бла). Я не специалист по XPO, но вот что я нашел.

Это также можно сделать с помощью NHibernate и EF: это так называемый подход, основанный на коде.

Athanasios Emmanouilidis 27.07.2017 13:24

Я поддерживаю тот факт, что удаление сложных объектов из некоторых коллекций занимает очень-очень много времени. Пока документация или форумы не смогли мне в этом помочь.

Кроме того, он действительно прост в использовании и быстро работает.

Также довольно сложно вычислить использование памяти, у меня были сложные большие объекты в моем дизайне, и работа с ними требовала больше памяти, чем я предполагал.

Мне очень неприятно работать с XPO. Основная идея ORM - абстрагироваться от базовой структуры данных. Но очень быстро вы заметите, что у них длина строки по умолчанию жестко запрограммирована на 60 символов, поэтому вы в конечном итоге добавляете эти уродливые строки. Неограниченное количество вещей вокруг каждой строки. Вот вам и абстракция ...

При моделировании более сложных объектов вы должны использовать много синтаксиса, которому действительно нет места в вашей объектной модели, например XPCollection. Я хотел сохранить класс, в котором был словарь строк, но, к сожалению, XPO не смог автоматически сохранить его в базе данных.

Таким образом, хотя он работает нормально для простых типов, он очень быстро выходит из строя, когда вы хотите сохранить более сложные вещи. Это в сочетании с их посредственной поддержкой действительно оставляет желать лучшего.

Я использовал их в течение многих лет на моей последней работе, хотя и не для xpo, и всегда находил их поддержку выдающейся. Постоянно отправляли сообщения об ошибках или запросы функций, и на все они очень быстро отвечали. Ошибки были исправлены быстро, и у них не было проблем с тем, чтобы дать мне ссылку на предварительный выпуск ночного бюллетеня, который содержал исправления. На все мои вопросы о том, как его использовать, также ответили так же быстро, часто с примерами кода. Я приложил большие усилия, чтобы сообщить о проблемах с качеством, так что, может быть, именно поэтому. думаю, только одна проблема была отмечена как дублирующаяся за все эти годы. Отличная компания для работы, ИМО.

Andrew Backer 19.08.2011 15:59

По умолчанию свойства строки отображаются в столбец размером 100. В любом случае вы можете легко изменить размер по умолчанию с помощью статического свойства SizeAttribute.DefaultStringMappingFieldSize (это нужно сделать только один раз). Кроме того, вы можете контролировать размер отдельных свойств, отмечая их атрибутом SizeAtrribute, например [Размер (255)] в C#. Более подробную информацию можно найти в documentation.devexpress.com/#XPO/…. Наконец, вы даже можете указать тип базы данных столбца, которому сопоставлено свойство, через DBTypeAttribute, например [DbType ("smalldatetime")]

Dennis Garavsky 21.08.2011 17:56

Что касается хранения пользовательских сложных типов, я сомневаюсь, что другие ORM имеют встроенную поддержку для этого. Готовая к работе система XPO способна сохранять стандартные и наиболее часто используемые типы, а обеспечивает возможность - хранить любой нестандартный тип через механизм преобразователей ценности. Например, ImageValueConverter и UtcDateTimeConverter являются примерами таких преобразователей значений. Реализовать пользовательский преобразователь значений просто, потому что вам нужно реализовать только два метода. Более подробную информацию можно найти на documentation.devexpress.com/#XPO/…

Dennis Garavsky 21.08.2011 18:06

XPO ужасен: у нас много проблем с утечками памяти, и на порядок объектов нельзя полагаться. Держитесь подальше от этой ORM и используйте что-то более устоявшееся, а не полагайтесь на стороннюю компанию, которой может не быть здесь завтра или в следующем году.

Thomas Amar 17.05.2013 10:39

С XPO в целом легко работать. Однако это может быть немного больно, когда вы планируете работать с устаревшей базой данных или пытаетесь внедрить ее в приложение для старых объектов. Самыми болезненными препятствиями, с которыми я столкнулся, были:

  • все объекты должны наследоваться от классов, связанных с XPO, и / или использовать атрибуты, связанные с XPO. Итак, никаких объектов POCO
  • нет поддержки постоянных полей только для чтения OOTB. Это возможно, но вам нужно немного взломать, чтобы XPO не обновлял поле в БД.
  • нет поддержки ассоциаций предварительной фильтрации, что может вызвать чрезмерную нагрузку на сеть
  • Плохая поддержка внешних составных ключей. Честно говоря, ни один ORM не обрабатывает составные ключи должным образом. Они считаются паттерном «анти-ORM».
  • несколько мелких неприятностей

Как отметил Деннис в комментариях, XPO был значительно улучшен с тех пор, как я изначально написал этот ответ. В частности, следующие вещи больше не являются проблемой:

  • нет сериализации, поэтому объекты XPO трудно использовать в сценарии с отказавшимися формами выигрыша, когда данные поступают через веб-службы. - XPO теперь поддерживает различные сценарии сериализации и может легко использоваться с WCF.
  • вы не можете выполнить отображение отношения «многие ко многим» с вашей собственной промежуточной таблицей. Xpo хочет конкретное имя для таких промежуточных таблиц. - Это уже не тот случай
  • нет поддержки перечислений в провайдере postgreSql - вам просто нужно написать действительно простой преобразователь значений, и у вас все хорошо.

Кроме того, следующие проблемы больше не будут проблемой со следующим выпуском XPO, который выйдет позже в этом году:

  • нет поддержки ключей типа long
  • нет поддержки схемы db в провайдере postrgeSql

В целом XPO был значительно улучшен. Устранены самые болезненные препятствия. Вы все еще можете столкнуться с проблемами при работе с устаревшей БД. Но в целом XPO пользоваться стало достаточно удобно.

Проблемы postgre - это крайние случаи, учитывая, что все другие, более распространенные, поддерживаются БД. 2 неверно, наследуется от XPCustomObject. 3 также применимо, только если вы используете сгенерированные поля. 4 противоречит цели ORM. WRT 9, используйте вместо этого поставщика Jet и сериализуйте его самостоятельно, если вы используете WCF / веб-службы. Не поймите меня неправильно, я не евангелист xpo; это просто убогий список.

Steven Evers 23.07.2009 09:12

2 не так уж и плохо. Если вы наследуете от XPCustomObject и поместите KeyAttribute в поле типа Int64, вы получите исключение. К сожалению, KeyAttribute работает только с полями Int32 или Guid. 3 применимо к сгенерированным полям - согласовано. Я имею в виду именно эту проблему. Сейчас нет возможности обрабатывать такие поля с помощью XPO. WRT 4 - что вы подразумеваете под «противодействием намерению ORM»? Мне нужно отразить схему моей существующей БД. Я не могу переименовать таблицы, чтобы они соответствовали «замыслу ORM». Мне нужно, чтобы ORM был достаточно гибким, чтобы охватить мои устаревшие сценарии.

Przemaas 23.07.2009 13:38

Проблемы с PostreSql - крайний случай - согласитесь. Я надеюсь, что провайдеры Xpo для других БД не содержат ошибок и позволяют работать с новейшими функциями этих БД. Вы называете мой список бедным, но все эти проблемы становятся реальными препятствиями, когда вы сталкиваетесь с ними при работе с устаревшими базами данных и Xpo.

Przemaas 23.07.2009 13:42

>> • все объекты должны быть унаследованы от классов, связанных с XPO - никаких объектов POCO

Dennis Garavsky 21.08.2011 17:01

>> • нет поддержки ключей типа long community.devexpress.com/blogs/xpo/archive/2011/07/28/…

Dennis Garavsky 21.08.2011 17:03

>> • нет поддержки постоянных полей только для чтения documentation.devexpress.com/#XPO/CustomDocument2875

Dennis Garavsky 21.08.2011 17:06

>> • вы не можете выполнить отображение отношения «многие ко многим» с вашей собственной промежуточной таблицей. Xpo хочет конкретное имя для таких промежуточных таблиц.

Dennis Garavsky 21.08.2011 17:12

>> • нет поддержки ассоциаций предварительной фильтрации

Dennis Garavsky 21.08.2011 17:20

>> • нет сериализации, поэтому объекты XPO трудно использовать в сценарии с отказом от форм выигрыша, когда данные поступают через веб-службы community.devexpress.com/blogs/garyshort/archive/2010/11/01/‌… community.devexpress.com/blogs/xpo/archive/2011/05/17/…

Dennis Garavsky 21.08.2011 17:24

>> • множество мелких неприятностей devexpress.com/Products/NET/ORM/whatsnew.xml Если у вас возникнут какие-либо дополнительные трудности с XPO (или любыми другими продуктами DevExpress), не стесняйтесь сообщать о них через Центр поддержки, чтобы получить быструю помощь от наших Команда поддержки: devexpress.com/sc

Dennis Garavsky 21.08.2011 17:37

>> XPO хорош для небольших новых проектов. Если вы конвертируете старые приложения или хотите сделать что-то большее, чем приложение для нескольких проектов, держитесь от этого подальше. devexpress.com/Products/NET/Application_Framework), платформу приложений .NET для быстрого создания современных бизнес-приложений. Мы также широко используем приложения на основе XPO и XAF внутри компании. Например, наш основной веб-сайт (www.devexpress.com) использует XPO для подключения к БД и BL.

Dennis Garavsky 21.08.2011 17:43

Привет, Деннис! Это правда, что XPO значительно улучшился с тех пор, как я написал этот ответ. Спасибо, что указали на это. Я обновлю свой пост должным образом

Przemaas 12.09.2011 11:52

>> • нет поддержки ассоциаций предварительной фильтрации, которые могут вызвать чрезмерную нагрузку на сеть. Просто хочу отметить, что это также было рассмотрено в 11.2: devexpress.com/issue=S38236.

Dennis Garavsky 03.11.2011 23:32

Я работаю с ним в течение 6-7 месяцев, и продавец для меня был тот факт, что все их компоненты пользовательского интерфейса относительно без проблем работают с XPO, а их компоненты пользовательского интерфейса на высшем уровне.

Кто-то может заметить, что их форумы плохо отслеживаются и мало полезного трафика - это правда. Секрет в том, чтобы заполнить билеты. Они быстро и точно отвечают на все обращения в службу поддержки.

И их веб-сайт центра поддержки взлетает и опускается, как йойо ...

Rebecca 18.02.2011 13:30

Да, сейчас лучше использовать Центр поддержки (devexpress.com/Support/Center) вместо форума XPO (community.devexpress.com/forums/163.aspx), если вы хотите получить быструю и гарантированную помощь от представителей DevExpress. К счастью, будет меньше путаницы между форумами и Центром поддержки, когда они будут объединены в один инструмент, а именно StackOverflow. Кстати, также есть возможность передавать отзывы о XPO и XAF через группы в социальных сетях: community.devexpress.com/blogs/eaf/archive/2011/05/06/…

Dennis Garavsky 21.08.2011 18:16

Это все, что вам нужно сделать, чтобы начать писать объекты домена (попробуйте сделать то же самое в других системах):

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. См. Информацию здесь ...

Другие вопросы по теме