ORM для использования с базами данных, которые имеют полугибкий дизайн схемы

c# dapper orm petapoco sql

Вопрос

Мне нравится «микро» подход Dapper, Massive, PetaPoco и т. Д., И мне нравится управлять SQL, который мы отправляем в базу данных, большую часть времени это относительно просто. Мне также нравится работать с POCO, однако, имея дело с несколько гибким дизайном схемы, вы часто сталкиваетесь с проблемами :)

Допустим, у нас есть объект Person, который ВСЕГДА имеет следующие свойства.

  • Я бы
  • имя
  • Эл. адрес
  • Телефон

Но в некоторых случаях могут быть дополнительные свойства, такие как

  • SpecialPhoneNumber
  • VeryCustomValue

Мне бы очень хотелось, чтобы POCO с общими свойствами, которые мы знаем, всегда будет там. Но пусть другой доступен в коллекции ключей / ценностей.

Какой был бы лучший подход? И поддерживает ли какой-либо из упомянутых «mirco-orm's» это? Я посмотрел на них всех, но не нашел никаких признаков того, что они делают, но, может быть, я что-то упустил.

Можно ли сделать это напрямую с помощью SqlDataReader? или будет ли производительность чтения сотен строк плохим при использовании отражения для создания объектов? У всех упомянутых орм, похоже, все хорошо, и я думаю, что использовать DataReader под ним.

Надеюсь, ты сможешь помочь :)

EDIT: Я должен, вероятно, упомянуть, что мы не контролируем архитектуру приложения. Это ERP-решение, которое позволяет индивидуальному клиенту настраивать свое приложение и базовую базу данных. Добавление полей в приложение добавляет столбцы в базу данных. Плохо! за то, что этого не ясно

Принятый ответ

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

Секретный соус - это ExpandoObject. Все, что входит, и все, что выходит из Massive, - это Expando, который позволяет вам делать все, что вам нужно. В его ядре ExpandoObject представляет собой просто IDictionary <string, object>

ExpandoObject реализует IDictionary<string, Object> и IEnumerable<KeyValuePair<string, Object>> , поэтому вы можете перечислять и тестировать участников так, как вам нужно.

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

Вы можете получить текущий код Massive от Github .

Dapper также может выбирать динамические объекты, но в отличие от Massive он может выбирать только данные и не может вставлять, обновлять или удалять их. EDIT: просмотр документов Dapper, похоже, он может выполнять модификации, так как он может выполнять любой sql. Существует еще одна недавняя информация о выполнении вставок с Dapper .


Популярные ответы

Вы можете взглянуть на динамическое сопоставление nHibernate.

http://ayende.com/blog/3942/nhibernate-mapping-dynamic-component

Он позволяет извлекать такие расширенные свойства в общий Directory<string,object> . Таким образом, у вас есть классы с такими универсальными пакетами (словари) и динамическое расширение XML-сопоставления.

nHibernate сделает все остальное за вас.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow