Какие-либо мысли о Пакете DevExpress XPO ORM? [закрытый]

В дополнение к превосходному и всестороннему ответу ninjagecko все, что требуется, чтобы закрепить два JS-массива в «tuple-mimic»:

//Arrays: aIn, aOut
Array.prototype.map.call( aIn, function(e,i){return [e, aOut[i]];})

Объяснение: Поскольку Javascript не имеет tuples, функции для кортежей, списков и наборов не были высокоприоритетными в спецификации языка. В противном случае подобное поведение доступно простым способом с помощью карты массива в JS> 1,6 . (map на самом деле часто реализуется разработчиками двигателей JS во многих двигателях JS 1.4, несмотря на то, что они не указаны). Основное отличие от zip, izip от Python, ... от функционального стиля map, так как map требует аргумента функции. Кроме того, это функция Array. Вместо этого можно использовать Array.prototype.map, если возникает дополнительная декларация для ввода.

Пример:

_tarrin = [0..constructor, function(){}, false, undefined, '', 100, 123.324,
         2343243243242343242354365476453654625345345, 'sdf23423dsfsdf',
         'sdf2324.234dfs','234,234fsf','100,100','100.100']
_parseInt = function(i){return parseInt(i);}
_tarrout = _tarrin.map(_parseInt)
_tarrin.map(function(e,i,a){return [e, _tarrout[i]]})

Результат:

//'('+_tarrin.map(function(e,i,a){return [e, _tarrout[i]]}).join('),\n(')+')'
>>
(function Number() { [native code] },NaN),
(function (){},NaN),
(false,NaN),
(,NaN),
(,NaN),
(100,100),
(123.324,123),
(2.3432432432423434e+42,2),
(sdf23423dsfsdf,NaN),
(sdf2324.234dfs,NaN),
(234,234fsf,234),
(100,100,100),
(100.100,100)

Связанная производительность:

Использование map над for -loops:

См. . Каков наиболее эффективный способ слияния [1,2] и [7, 8] в [[1,7], [2,8]]

zip tests [/g2]

Примечание: базовые типы, такие как false и undefined не обладают прототипной иерархией объектов и, следовательно, не предоставляют функцию toString. Следовательно, они отображаются как пустые в выводе. Поскольку второй аргумент parseInt является базовым / числовым основанием, которому нужно преобразовать число в, и поскольку map передает индекс в качестве второго аргумента своей аргумент-функции, используется функция-обертка.

23
задан NullUserException 16 December 2011 в 18:15
поделиться

8 ответов

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

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

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

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

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

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

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

16
ответ дан Jeremy McGee 29 November 2019 в 02:22
поделиться

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

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

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

9
ответ дан Anders Rune Jensen 29 November 2019 в 02:22
поделиться

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

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

4
ответ дан Steven Evers 29 November 2019 в 02:22
поделиться

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

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

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

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

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

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

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

4
ответ дан Przemaas 29 November 2019 в 02:22
поделиться

Плюсы и минусы по сравнению с чем? Существует множество альтернатив, наиболее популярным из которых является nHibernate, с новым детским ADO.NET Entity Framework в блоке.

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

0
ответ дан Nicholas 29 November 2019 в 02:22
поделиться

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

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

0
ответ дан Dave Arkell 29 November 2019 в 02:22
поделиться

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

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

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

0
ответ дан Tomas Pajonk 29 November 2019 в 02:22
поделиться

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

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);
        }
    }
}
0
ответ дан 29 November 2019 в 02:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: