Я пытаюсь решить плюсы и минусы 2 ORM прежде всего в этой области.NHibernate vs. EF 4.1+
- Совместимость с Sql Server 2008 R2 & 2012.
- Это очень важно, так как мы просто не имеют ресурсов для отладки плохой поддержки существующего стека MS технологии.
- Кроме того, планирование вперед с 2012 года в значительной степени выходит и планирует мигрировать к нему на месте.
- Поддержка .NET 4.0 и 4.5 (наступающий)
- Опять очень важно для почти той же самой причине выше.
- Обработка транзакций и настольные подсказки, например. forcecan силаeek, читать неизученный.
- Много раз оптимизатор запросов хорошо выполняет свою работу, в других случаях я хочу, чтобы гибкость подсказывала ему, что делать.
- Поддержка для разговора, саморегулирующаяся присоединять & отрывать
- Это несколько фундаментально. Ненавижу держать сессию открытой в течение длительного периода. Особенно в среде распределенных вычислений/веб-ферм.
- Возможность обработки кода первой разработки, создания и обновления схемы без уничтожения данных.
- EF 4.1 кажется желающим в этом отношении, хотя 4.3 прыгает и привязывается лучше. Также нравятся аннотации данных лучше, чем отдельные классы отображения в NH. Причина, по которой я хочу иметь возможность отправлять в классе, и оттуда сможет создать модель сохранения, не расширяя метод для классов сопоставления.
- Поддержка IRepository шаблон
- Поддержка LINQ
- Несколько привязан к (6) выше, я хочу действительно хорошую поддержку LINQ. Я не хочу, разработчиков слоняться вокруг с реализацией более низким уровня и получать сам прилип к одному конкретному ORM
- Производительность
- Поддержки для массового CRUD операций, без необходимости загружать данные в слой приложения. Например. Я хочу увеличивать все строки в столбце конкретной таблицы на 1. Я не хочу загружать это в память и наращивать строки один за другим. Это было бы безумным для такой простой операции. Linq2Sql использовал Magiq для обработки такого рода вещей, что у NH и EF?
- Кэширование, надежная загрузка, ленивая загрузка, навигационные свойства.
- Позвольте мне быть откровенным. Я ненавижу эти вещи, когда это делается неявно. Причина в том, что трудно отличить то, что кэшировано, устарело от нового. В EF я обычно отказываюсь от всех свойств навигации, потому что я не хочу, чтобы эти свойства загружались с помощью 5-го уровня, потому что это то, что требуется текущей операции, но дальше по потоку другой разработчик пытается сделать счет, который будет неточным.
- Итак, моя личная политика - все SOA должны быть без гражданства, если нет веской причины. Если вам нужны ссылки на данные, получите их от настойчивости. Он будет медленнее, но код будет более читабельным и гибким.
- Аналогично для кеширования. Он достаточно сложный, поскольку он находится в распределенной среде, я хочу, чтобы все кэширование было очень явным. Если разработчик хочет закодировать кеш, он должен сделать это, а не код против ORM, и заставить его выглядеть так, как будто он извлекает свежие данные из состояния, когда на самом деле он получает устаревшие данные.
- Теперь вопрос в том, имеет ли NHibernate какую-либо концепцию/абстракцию, которая сделала бы кеширование, нетерпеливую/ленивую загрузку намного более явной, чем та, которая в настоящее время доступна в EF. В этом случае меня мало волнует легкость развития, я больше забочусь о ясности и ясности.
Кроме того, я не забочусь много для ОСС против propietary аргумента. Команда не может позволить себе время заглянуть под капот и начать возиться с кодом других людей. Я больше забочусь о том, как «он просто работает», чем что-либо еще.
Ну письменный вопрос, хотя я боюсь, что это немного открыто для SO; вопросы здесь обычно/часто имеют некоторый исходный код и должны приводить к ясным, практическим ответам. Возможно, это лучше подходит для Programmers.SE? – Jeroen