Какой ОРМ использовать?

Я разрабатываю приложение, которое будет иметь эти классы:

class Shortcut
{
    public string Name { get; }
    public IList<Trigger> Triggers { get; }
    public IList<Action> Actions { get; }
}

class Trigger
{
    public string Name { get; }
}

class Action
{
    public string Name { get; }
}

И у меня будет еще 20 классов, которые будут получены из Trigger или Action, поэтому в итоге у меня будет один класс Shortcut, 15 Action -распределенных классов и 5 Trigger -удаленные классы.

Мой вопрос: , какой ORM лучше всего подходит для этого приложения? EF, NH, SubSonic или, может быть, что-то еще (Linq2SQL)?

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

Я уже нашел эту статью о обновлении схемы NH, цитируя:

К счастью, NHibernate предоставляет нам возможность обновлять существующую схему, то есть NHibernate создает обновление script, которое может быть применено к базе данных.

Я никогда не обнаружил, как реально генерировать обновление script, поэтому я не могу сказать NH обновить схему. Возможно, я что-то неправильно понял, я просто не нашел его.

Примечание: Если вы предлагаете EF, то будет EF 1.0 подходящим? Я бы предпочел использовать более старую .NET, чем 4.0.
Примечание 2: Структура ORM должна быть бесплатной для коммерческого использования.
Примечание 3: Я также буду использовать обфускацию кода, случайное переименование всех символов и т.д., поэтому ORM должен поддерживать это.

Ответы

Ответ 1

До .NET 4, Entity Framework была просто недостаточно зрелой для моих вкусов. Кроме того, он не поддерживает POCOs.

С EF out я бы выбрал NHibernate. Чтобы сделать конфигурацию на основе кода и несколько проще, я бы также использовал Fluent NHibernate. NHibernate очень зрелый и имеет большую поддержку сообщества. Он отлично подходит для обновления схемы базы данных из последнего кода. Очень рекомендуется.

Я не думаю, что кто-то из других - серьезные варианты. Entity Framework быстро получит разумную долю, потому что она встроена и серьезно продается MS. NHibernate останется жизнеспособным конкурентом, потому что он обладает большой популярностью и зрелостью. Остальные будут медленно падать на обочину, пока они не будут использоваться только небольшими числами горячих сторонников.

Ответ 2

Думаю, вы сравниваете два отдельных класса систем:

  • SubSonic и Linq-to-SQL довольно просты, тонкий слой поверх базы данных. Они обеспечивают в основном только сопоставление 1:1 между таблицей базы данных и объектом домена. Если это достаточно хорошо для вашего случая, то эти инструменты являются простейшими, самыми простыми в использовании и лучшими ORM-версиями тоже.

  • EF в .NET 4 и NHibernate находятся в совершенно другом классе - они предоставляют функции уровня предприятия, поддерживают несколько баз данных, поддерживают картографирование и преобразование структуры базы данных в другую перспективную структуру домена, хорошо в этом. EF4 также поддерживает POCO, и все проблемы, которые были использованы против EF, до сих пор довольно спорны с .NET Framework версии Entity Framework.

    Но и NHibernate, и EF4 более сложны, они требуют больше настройки, больше кривой обучения, пока вы не "получите", они немного тяжелее на ногах, у них есть дополнительные слои отображения, которые позволяют использовать эти расширенные функции, но они а также эффективность затрат, и в целом они усложняют ситуацию.

Итак, я думаю, это действительно сводится к вашим требованиям: если вам нужна простая и простая в использовании система, переходите к Linq-to-SQL или Subsonic. Если вам нужно больше возможностей на уровне предприятия и не против дополнительной работы, необходимой для настройки этих ORM, выберите EF4 или NHibernate.

Ответ 3

См. DataObjects.Net: хотя это коммерчески, есть функции, которые вам нужны (например, обновление схемы).