Выбор базы данных и ORM для проекта .NET - PullRequest
3 голосов
/ 06 августа 2009

Я работаю над приложением .NET, использующим Silverlight на стороне клиента. Теперь я подошел к моменту, когда я хочу выбросить свои статические фиктивные данные на стороне сервера и вместо этого добавить базу данных.

Для базы данных я бы хотел использовать одну из них ORM, где я могу просто пометить свои классы моделей, и таблицы базы данных созданы для меня. Ранее я провел несколько тестов с Groovy и Grails и подумал, что GORM справился с работой. Какой лучший способ настроить базу данных в .Net?

Первое, что меня поражает, это использование nHibernate. Я ничего не знаю о nHibernate, но я слышал, что многие люди с энтузиазмом упоминают об этом. Но затем я вижу, что ADO .Net также является ORM, встроенным в платформу. Превосходит ли nHibernate ADO? А что за дело с LINQ? Я вижу, что это также указано как ORM, но я думаю, что LINQ был больше для части запроса? Могу ли я «определить» базу данных через LINQ?

Любые комментарии и рекомендации приветствуются. Я также хотел бы услышать, если у вас есть мнения о том, какую базу данных использовать. Я предполагаю, что MS SQL Server - самый простой выбор?

Ответы [ 6 ]

9 голосов
/ 06 августа 2009

NHibernate и Silverlight:

Один из участников NHibernate, Ayende Rahien, недавно опубликовал сообщение в блоге о NHibernate и Silverlight:

У меня есть несколько вопросов о NHibernate и Silverlight. На самом деле это очень легко.

Даже не пытайся. Они не ладят. На самом деле, они даже не собираются ладить.

Silverlight не имеет System.Data.IDbConnection, и вы можете смело предположить, что это несколько важно для NHibernate.

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

И на это тоже легко ответить, он будет работать как любая клиент-серверная система. Применяются все те же правила.

Так что NHibernate должен работать до тех пор, пока вы не планируете использовать его непосредственно из клиента Silverlight.

NHibernate:

NHibernate - отличный ORM, но у него довольно крутая кривая обучения, поэтому вы должны быть готовы потратить некоторое время на изучение фреймворка, если выберете NHibernate. Если вы сделаете эти инвестиции, вы будете вознаграждены гибкостью и мощью, которые предоставляет NHibernate.

Замок ActiveRecord:

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

LINQ to SQL:

LINQ to SQL и ADO.NET Entity Framework - это два ORM, которые включены в .NET Framework. LINQ to SQL - это меньший и более простой фреймворк, чем Entity Framework, но он обладает некоторыми приятными функциями и с ним довольно легко начать работу.

Entity Framework:

С Entity Framework также довольно легко начать работу, но в текущей версии у него есть несколько довольно больших проблем, поскольку он все еще в версии 1. Однако следующая версия Entity Framework улучшит и исправит многие из текущие недостатки.

LINQ и генерация схемы для каркасов:

Все эти фреймворки поддерживают использование LINQ в качестве языка запросов. LINQ to SQL и NHibernate могут сгенерировать для вас схему на основе классов вашего домена и сопоставления. Entity Framework не может сгенерировать схему в v1, но v2 добавит эту функциональность.

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

Я думаю, что для системы без существующей базы данных автоматические сопоставления NHibernate + FluentNHibernate стоили бы:

http://wiki.fluentnhibernate.org/show/AutoMapping

Раньше я не использовал autoppings (мне дали схему), они будут моей первой идеей для изучения.

Второй вариант, и, вероятно, более надежный / проверенный - это ActiveRecord:

http://www.castleproject.org/activerecord/index.html

Опять же, я тоже этим не пользовался, но я полагаю, что вы помечаете свои сущности атрибутами для указания сопоставления.

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

Я также понятия не имею, как это влияет на Silverlight.


В ответ на комментарий (здесь легче набрать, чем комментарий):

Что поддерживает NHibernate, так это возможность взять файлы сопоставления, определенные в проекте, и экспортировать их в базу данных. Это означает, что вы определяете свою схему один раз (ваше приложение).

Теперь обычно эти файлы сопоставления представляют собой xml. Это не имеет большого значения, но, очевидно, возможности для улучшения.

FluentNHibernate позволяет вам (а) определять файлы сопоставления в коде или (б) автоматически создавать файлы сопоставления из ваших сущностей в соответствии с соглашением. Я использую метод (а), потому что мой БД ужасен и в этом мире нет соглашения для него, но для вашего использования я бы порекомендовал (б), который является автоматическим. Приведенная выше ссылка на вики дает быстрый пример того, как можно сопоставить продукт и полку.

Active Record работает, позволяя вам определять схему не в XML, а как атрибуты вашей сущности. Это намного больше, чем это, хотя он также реализует шаблон ActiveRecord, который использует RoR (Entity.Save и т. Д.). Я никогда не использовал это, но это широко используется.

Одной из замечательных особенностей генерации схемы NHibernate является модульное тестирование. Я могу создать тестовую базу данных в SQL Lite в несколько строк кода, экспортировать схему, заполнить тестовыми данными, запустить тест и разобрать его. Это облегчает интеграционное тестирование, а также помогает проверить правильность работы запросов.

Я не знаю, являются ли это лучшими решениями, поскольку я действительно использую только NHibernate, поэтому не могу комментировать Linq2SQL, EF или другие ORM.

2 голосов
0 голосов
/ 11 сентября 2009

Я бы абсолютно использовал ECO . Это бесплатно до 12 классов и есть много полезных функций, чтобы предложить. Он сосредоточен вокруг модели и использует OCL для навигации по модели. OCL, на мой взгляд, намного проще в использовании, чем SQL или LINQ.

например, это построенное выражение в OCL:

Person.allinstances.address->select(hasGeoPoint).streetname

В этом примере есть 2 класса, Person и Address. Человек может иметь адрес, а Адрес может иметь географическую точку (в этом случае это обозначается логическим флагом) и название улицы. Вышеупомянутое выражение фильтрует все названия улиц, которые имеют геопункт из адресов всех лиц.

Другая важная функция в ECO - это производные атрибуты, которые позволяют вычислять значения из других атрибутов (которые, в свою очередь, могут быть получены). Затем значение кэшируется из первого запроса, что экономит время процессора. ЭКО также можно использовать из существующей базы данных.

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

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

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

Если вы уже использовали CodeSmith и хотели бы автоматически сгенерировать большую часть кода LINQ to SQL, вам может понадобиться PLINQO .

Во-вторых, есть также инструмент под названием SubSonic , который также может создавать слой доступа к данным LINQ to SQL с минимальными трудностями.

Создание слоя доступа к данным с помощью любого из этих инструментов должно дать вам сборки, к которым может получить доступ пользовательский интерфейс Silverlight.

О, обратите внимание, сам CodeSmith стоит денег, в то время как шаблон PLINQO и генератор SubSonic бесплатны.

Удачи в вашем проекте.

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