Помогите мне выбрать между linq to sql и nhibernate на основе следующих - PullRequest
0 голосов
/ 04 августа 2009

Борьба между выбором linq2sql и nhibernate.

Позвольте мне дать вам некоторое представление о заявке в форме пункта:

  • это приложение asp.net mvc
  • будет много таблиц, может быть, 50-60 (sql server 2008)

  • я бы хотел, чтобы вся базовая логика грубости была сделана для меня (которую, я думаю, может дать мне шаблон nhiberate + хранилище)

  • У меня нет слишком сложных отображений, мои таблицы будут выглядеть примерно так:

Пользователь (идентификатор пользователя, имя пользователя) UserProfile (идентификатор пользователя, ...) Контент (contentID, заголовок, тело, дата) Content_User (contentID, userID)

Таким образом, в general у меня будет таблица PK, затем множество других таблиц, которые ссылаются на этот PK (то есть таблицы FK). У меня также будет много таблиц сопоставления, которые будут содержать пары PK, FK.

Мудрый объект, я хочу User.cs, UserProfile.cs, а затем способ загрузки каждого объекта. Я не ищу класс User, который имеет свойство UserProfile и свойство Content Collection (возможно, будет 10-20 таблиц, которые будут связаны с пользователем, я просто хотел бы сохранить линейность, если это имеет смысл).

Единственное, что заставляет меня учиться в nhibernate: кросс-потенциал дБ и шаблон репозитория, который даст мне базовые операции дб во всех моих основных таблицах почти мгновенно!

Ответы [ 3 ]

2 голосов
/ 04 августа 2009

Поскольку вы, похоже, имеете довольно прямое отображение из класса в таблицу, Linq to SQL должен выполнить свою задачу без каких-либо трудностей. Это позволило бы вам начать работу очень быстро, без первоначальной работы по сопоставлению домена вручную с базой данных.

Альтернативой может быть использование NHibernate + Fluent NHibernate и его функции AutoMapping, но имейте в виду, что Fluent NHibernate AutoMapping еще довольно молод.

Я не совсем уверен, что понимаю, как вы хотите, чтобы ваши сущности выглядели, но с Linq to SQL вы получите большой сгенерированный беспорядок, который вы затем сможете расширить с помощью частичных классов. NHibernate позволяет вам создавать классы так, как вы хотите, и не генерирует ничего для вас из коробки. Вы могли бы использовать классы POCO с Linq to SQL, но это лишило бы всех преимуществ использования Linq to SQL, а не NHibernate.

Что касается шаблона репозитория и использования универсального репозитория, то это может быть сделано весьма неплохо и с Linq to SQL, а не только с NHibernate. На мой взгляд, это одна из приятных вещей в Linq to SQL.

Если вам, вероятно, понадобится поддержка других баз данных, кроме SQL Server, NHibernate является единственным выбором. Однако, если это, вероятно, не будет проблемой, я бы рекомендовал не использовать это в качестве основного фактора при выборе. Другие факторы, вероятно, будут влиять на ваш проект больше.

Вывод:

В общем, я бы рекомендовал Linq для SQL, в этом случае, так как это позволило бы вам быстро начать работу и этого достаточно для ваших нужд. Предварительным условием для этого является то, что у вас нет проблем с мыслью о создании грязного кода в вашем домене, и вы совершенно уверены, что в будущем не будет необходимости поддерживать другие базы данных. В противном случае я бы порекомендовал NHibernate, так как это действительно потрясающий ORM.

1 голос
/ 05 августа 2009

linq2sql действительно хочет, чтобы вы работали с 1 таблицей на отображение классов. Поэтому, если у вас есть таблица UserMaster и таблица UserDetail, вы смотрите на два объекта при использовании генерации объектов linq по умолчанию. Вы можете обойти это путем сопоставления сущностей linq с бизнес-сущностями (см. скринкаст магазина Роба Конери), но затем вы вернулись к написанию кода сопоставления объектов или к использованию чего-то вроде Automapper.

Если вы хотите разделить свои классы по нескольким таблицам, я бы сказал, что нужно использовать NHibernate. Если нет, то у linq более низкая кривая обучения.

0 голосов
/ 04 августа 2009

Единственный способ использовать nHibernate в библиотеке ActiveRecord Castle Project. В противном случае nHibernate становится его собственным небольшим инфраструктурным проектом. Ознакомьтесь с некоторыми вопросами в теге nHibernate , чтобы понять, о чем я говорю.

Единственное, что я могу изменить в AR, это возвращать результаты операций SELECT в виде List вместо T []. Конечно, с исходным кодом на C # я могу сделать это, если захочу.

С ActiveRecord информация о сопоставлении сохраняется в атрибутах, которыми вы украшаете свои классы. Это гений, и я большой сторонник шаблона и этой конкретной библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...