Я давний пользователь библиотеки DevExpress XPO. У него много замечательных функций, но есть несколько слабых мест:
- При сохранении существующего объекта все свойства отправляются в запросе на обновление; изменения отслеживаются для каждого объекта, а не для каждого свойства.
- Оптимистическая блокировка выполняется для каждого объекта, а не для каждого столбца.
- Когда возникает исключение оптимистической блокировки, не предоставляется контекст, описывающий природу конфликта; Ваш единственный реальный ответ - не выполнить операцию или воспроизвести ее и повторить попытку.
- Поддержка LINQ для XPQuery очень слабая (по крайней мере в 8.1, которую мы используем). Таким образом, вам часто приходится использовать XPView, который не является безопасным для типов, или XPCollection, который может возвращать столбцы, которые вам не обязательно нужны.
После прочтения о том, как LINQ to SQL реализует оптимизацию блокировки и обработки конфликтов обновления, я был продан! Мне нравится, как он реализует оптимистическую блокировку на уровне столбцов и не нуждается в добавлении столбца в таблицу. Возможность проверять и обрабатывать точную природу конфликтов - это прекрасно. А тот факт, что они отслеживают изменения по столбцам, должен значительно повысить эффективность запросов на обновление.
Конечно, я еще не использовал LINQ to SQL в реальных приложениях, поэтому я не знаю, насколько это реально. Кроме того, мне неясно, есть ли у него аналоги некоторых функций, которыми мы наслаждаемся в XPO, таких как:
- Автоматические обновления схемы (мы верим, что структура базы данных управляет структурой базы данных, а не наоборот, и это значительно упрощает развертывание программного обеспечения)
- Два варианта реализации наследования (отношения с одной и той же таблицей или с таблицей один-к-одному)
- Поддержка хранения в памяти (хотя я полагаю, что мы могли бы заменить LINQ на Objects в наших модульных тестах)
- Настройка провайдера хранилища (что позволило нам добавить поддержку NOLOCK в наши запросы XPO)
Мы собираемся выполнить предварительную частичную миграцию, в которой мы временно будем использовать два ORM для разных частей нашего кода. Кто-нибудь из вас имел реальный опыт работы с XPO и LINQ to SQL? Как они сравниваются на практике? В частности, вам известны какие-либо функции, которых нет в LINQ to SQL, которые могли бы создать проблемы при переносе кода?
О, и я должен даже заботиться о LINQ to Entities? Это выглядит намного сложнее, чем все, что нам нужно.