2009-04-13 7 views
2

Некоторое время назад мы начали разработку нового проекта, который имеет около 25-30 различных классов/типов/моделей, которые сильно связаны друг с другом либо через 1 : n, n: m или n: 1.Перенос из «родных» OODBMS в ORM (Entity Framework/SQL Server)

В то время мы поехали с родной системой .net oodbms в основном потому, что это позволило нам сделать, чтобы взять нашу объектную модель и просто добавить несколько методов, связанных с сохранением (-calls) здесь и там, и мы были готовы пойти , Однако со временем мы столкнулись со все более и более оговорками, действительно плохими, нефиксируемыми (в разумные сроки) ограничениями, которые заставляли нас внедрять медленные обходные пути, приводящие к посредственным проблемам производительности и масштабируемости на горизонте, а лицензионные сборы почти увеличились на фактор 5 для нас без каких-либо изменений на нашем конце (их купил большой инк.).

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

Итак, в основном, вот мой вопрос: есть ли у кого-нибудь реальный опыт работы с Microsoft Entity Framework или любым другим .NET ORM, который поддерживает конфигурацию как можно более работоспособную, а также хорошо работает в тесно/сильно связанных объектах? Объем данных, которые мы храним, не является удивительным или обширным в любом виде (мы ожидаем, что в течение следующих трех лет в течение всех трех лет все объекты будут заполнены в 100 тыс. Экземпляров).

Есть ли у кого-нибудь идеи/предложения по ORM и/или переходу от oodbms к rdbms?

ответ

1

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

  1. Вам не нужно делать (m) любые добавления/изменения классов классов домена для поддержки сохранения. NHibernate имеет большое значение для поддержки незнания стойкости в вашей модели домена, хотя вы можете обнаружить, что вам нужно внести некоторые незначительные изменения, такие как маркирование большего количества методов/свойств как виртуальных, чем, например, в противном случае.
  2. После сопоставления существующей объектной модели вы можете сгенерировать схему для своей базы данных. Это огромная экономия времени для разработки домена (или только объектной модели). Эта функциональность поддерживается с помощью метода FluentConfiguration.ExposeConfiguration() с белым NHibernate или с помощью инструмента hbm2ddl со стандартными файлами сопоставления NHibernate. Это также помогает, конечно же, в ремонтопригодности - изменения в вашей объектной модели могут быть быстро отражены в вашей схеме базы данных.
  3. Использование свободного NHibernate для сопоставления помогает сделать первоначальное отображение довольно быстрым, поскольку вы получаете автозаполнение и упрощенную модель сопоставления. Это также поможет вам найти требуемую техническую поддержку - ваше сопоставление объявляется в коде с белым NHibernate, поэтому инструменты рефакторинга будут соответствующим образом изменять ваше сопоставление. Вы также можете обнаружить, что вы можете использовать автоматическое форматирование Fluent NHibernate и избегать сопоставления объектной модели вручную.

Использование Entity Framework для этого будет более сложным. В то время как структура объекта является способным ОРМОМ во многих отношениях, это не так развито, как NHibernate, и есть несколько причин, в данном случае конкретно, почему я думаю, что это, вероятно, не лучший выбор:

  1. Вы должны сделать много изменений в вашей существующей объектной модели для поддержки Entity Framework. Если вы хотите использовать предоставленные в настоящее время инструменты для инфраструктуры сущностей, вам, вероятно, потребуется перенести ваш код на сгенерированные частичные классы, которые наследуются от базового класса сущности EntityObject. Это требование наследования может или не может быть проблемой для вас в зависимости от вашей существующей объектной модели. Вы можете избежать этого, поддерживая some interfaces в своем коде, но это нетривиально, и я думаю, вы потеряете много встроенной поддержки инструментов для управления вашими сопоставлениями.
  2. Вам почти наверняка потребуется вручную создать схему базы данных. С объектной моделью хорошего размера это, как правило, не является незначительной задачей.
  3. Сущность framework не поддерживает прозрачную ленивую загрузку из коробки. Я уверен, что прозрачная ленивая загрузка - это то, с чем вы привыкли с OODBMS, и поддерживается большинством других ORM (включая NHibernate, конечно), но с инфраструктурой сущностей вы обнаружите, что вам нужно явно .Load() связанные объекты (как родительские, так и дочерние отношения), прежде чем ссылаться на них в коде. Для этого есть обходные пути (например, this one), но это не встроенная функция.

В целом, на мой взгляд, для объектно-первой разработки или того, где вы пытаетесь использовать существующую объектную модель, NHIbernate - лучший выбор. Для развития, ориентированного на данные, платформа Entity Framework (или linq to sql или даже дозвуковая) становится более жизнеспособным выбором.

Вы также можете оценить коммерческие предложения ORM, такие как Lightspeed. У меня мало опыта с этим конкретным инструментом (клиенты, как правило, возражают против оплаты ORM, когда есть хорошие бесплатные альтернативы), но он высоко ценится.

0

У меня нет опыта работы с OODBMSes, но мой опыт работы с NHibernate + MS SQL Server был очень позитивным с точки зрения обеспечения соблюдения и каскадирования изменений по принципу «один ко многим», «многие-к-одному» и «многие -Много отношения.

Какой инструмент OODBMS вы используете? Возможно, существует средство миграции OODBMS -> RDBMS, но я не знаю о нем.

 Смежные вопросы

  • Нет связанных вопросов^_^