Советы по переходу с XPO на LINQ to SQL

Я давний пользователь библиотеки DevExpress XPO. У него много замечательных функций, но есть и недостатки:

  1. При сохранении существующего объекта все свойства отправляются в запросе на обновление; изменения отслеживаются для каждого объекта, а не для каждого свойства.
  2. Оптимистическая блокировка выполняется для каждого объекта, а не для каждого столбца.
  3. Когда возникает исключение оптимистической блокировки, контекст, описывающий природу конфликта, не предоставляется; ваша единственная реальная реакция — провалить операцию или воспроизвести ее и повторить попытку в цикле.
  4. Поддержка LINQ для XPQuery очень слаба (по крайней мере, в версии 8.1, которую мы используем). Таким образом, вы часто вынуждены использовать XPView, который не является типобезопасным, или XPCollection, который может возвращать столбцы, которые вам не обязательно нужны.

Прочитав о том, как LINQ to SQL реализует оптимизирующую блокировку и обработку конфликтов обновлений, я был поражен! Мне нравится, как он реализует оптимистическую блокировку на уровне столбца и не требует добавления столбца в таблицу. Возможность исследовать и обрабатывать точную природу конфликтов — это здорово. И тот факт, что они отслеживают изменения для каждого столбца, должен сделать его запросы на обновление намного более эффективными.

Конечно, я еще не использовал LINQ to SQL в реальных приложениях, поэтому не знаю, можно ли сравнить его в реальности. Кроме того, мне неясно, есть ли у него аналоги некоторых функций, которыми мы наслаждаемся в XPO, таких как:

  1. Автоматические обновления схемы (мы верим, что структура базы данных определяется объектным дизайном, а не наоборот, и это значительно упрощает развертывание программного обеспечения)
  2. Два варианта реализации наследования (отношения одной таблицы или таблицы "один к одному").
  3. Поддержка хранилища в памяти (хотя я полагаю, что мы могли бы заменить LINQ to Objects в наших модульных тестах)
  4. Настройка поставщика хранилища (что позволило нам добавить поддержку NOLOCK в наши запросы XPO)

Мы собираемся выполнить пробную частичную миграцию, в которой временно будем использовать две ORM для разных частей нашего кода. Был ли у кого-нибудь из вас реальный опыт работы как с XPO, так и с LINQ to SQL? Как они соотносятся на практике? В частности, знаете ли вы о каких-либо функциях, отсутствующих в LINQ to SQL, которые могли бы создать проблемы при миграции кода?

О, и должен ли я вообще заботиться о LINQ to Entities? Это выглядит намного сложнее, чем все, что нам нужно.


person Jacob    schedule 10.07.2009    source источник
comment
Просто любопытно, вы тоже смотрели на DB4Objects? Я понятия не имею о схемах блокировки в db4o, но любопытно посмотреть, оценили ли вы это. (это не ORM, хотя это настоящая ООСУБД)   -  person Tim Jarvis    schedule 10.07.2009
comment
Нет, я не смотрел на DB4Objects. Поскольку мы полагаемся на службы SSAS, мы не можем изменить механизм нашей базы данных.   -  person Jacob    schedule 10.07.2009
comment
Было бы любопытно получить обновленную информацию о том, как вы нашли LinqToSql против XPO. Или вы пошли другим путем? -- Алекс   -  person aryeh    schedule 16.12.2009
comment
напишу ответ на свой вопрос   -  person Jacob    schedule 16.12.2009
comment
Просто хотел прокомментировать ›› 1. При сохранении существующего объекта все свойства отправляются в запросе на обновление; изменения отслеживаются для каждого объекта, а не для каждого свойства. ‹‹ Это можно реализовать, как описано в alfware.com.au/component/content/article/1-blog/ Существует также встроенное решение для отложенных свойств: community.devexpress.com/blogs/garyshort/archive/2010/10/13/   -  person Dennis Garavsky    schedule 05.11.2011


Ответы (2)


Мне грустно, что я не получил ответов от сообщества, но вот мои мысли на данный момент. У меня была возможность некоторое время опробовать LINQ to SQL и ADO.NET Entity Framework в разных проектах, и я чувствую, что ADO.NET Entity Framework лучше удовлетворит наши потребности. Что касается специфичных для XPO функций, которые я надеялся сохранить:

  1. Автоматические обновления схемы должны быть запущены после преобразования. Это небольшое раздражение, но есть несколько преимуществ в отдельном обслуживании.
  2. ADO.NET Entity Framework имеет множество вариантов сопоставления данных; различные модели наследования, по-видимому, поддерживаются.
  3. Что касается хранилища в памяти, я все еще не уверен, насколько хорошо это поддерживается. Похоже, существует поставщик SQLite ADO.NET, совместимый с Entity Framework, и SQLite может выполнять хранение в памяти, поэтому теоретически модульные тесты могут использовать другую строку подключения, указывающую базу данных в памяти. Надеюсь, это так просто; в противном случае написание модульных тестов будет довольно сложно выполнить без большой работы (абстрагирование интерфейса репозитория и т. д.).
  4. Я еще не изучал настройку провайдера. Я попытался спроектировать систему таким образом, чтобы у нас не было такого количества данных, совместно используемого между службами, как раньше, поэтому, возможно, нам не понадобятся все те операторы WITH (NO LOCK), которые мне требовались в предыдущих системах. Или, может быть, SQL Server 2008 улучшил свои механизмы блокировки, чтобы мы не сталкивались с теми же проблемами блокировки.
person Jacob    schedule 16.12.2009

Итак, вы перенесли свое приложение с XPO на Linq2Sql, не так ли? Я тоже играл с XPO как частью XAF, честно говоря, я предпочитаю Linq2Sql/EF XPO, но поскольку он тесно связан с XAF, у меня нет другого выбора. Мы собираемся использовать XAF для ускорения реализации пользовательского интерфейса нашего продукта. Я думаю, что XAF неплохо справляется со своей задачей, но меня очень беспокоит XPO.

Спасибо,

person Tien Do    schedule 12.03.2010
comment
У меня не было возможности перенести его, и теперь я работаю в другой компании. Тем не менее, я использовал EF в будущих продуктах и ​​был очень доволен этим. Я бы не слишком беспокоился о XPO. Большинство моих проблем возникло из-за его использования в веб-среде с высоким параллелизмом и многопоточностью. Если вы используете это с XAF, я предполагаю, что это однопоточное приложение с низким параллелизмом. Просто знайте, как оптимистичная блокировка работает с самого начала, и все будет в порядке. - person Jacob; 12.03.2010
comment
Да, это бизнес-приложение Winform и однопоточное, поэтому я мало беспокоюсь о параллелизме. Я играл с XAF в течение нескольких дней, и его оптимистичная блокировка достаточно хороша для моей ситуации, но не совсем оптимальна. Тем не менее, XAF разрабатывался в течение многих лет, поэтому ему приходится иметь дело со своим устаревшим кодом. - person Tien Do; 19.03.2010