Использование nNHibernate с излучаемым кодом - PullRequest
1 голос
/ 27 июля 2011

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

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

Теперь у меня две проблемы

1) Слишком много SQL-операторов.Проблема в том, что поддерживать

2 будет ночной кобылой. 2) Слишком много SQL-операторов.Проблема: меня попросили поддержать несколько баз данных, что подразумевает больше SQL-отчетов.

Я должен признать, что я мало работал с (n) Hibernate или Reflection.Emit.

Но мне было интересно, насколько сложно было бы генерировать классы для моих таблиц, используя Reflection.Emit, а затем использовать ActiveRecord / nHibernate для доступа к данным?Чтобы мне не приходилось делать грязную работу, связанную с базой данных напрямую.

1 Ответ

2 голосов
/ 28 июля 2011
class Fact
{
    public virtual int Id { get; set; }
    IDictionary Properties { get; set; }
}

Шаблон

<hibernate-mapping>
  <class name="Fact">
    <dynamic-component name="Properties">
      <!--placeholder -->
    </dynamic-component>
  </class>
</hibernate-mapping>

заменить <!--placeholder --> сгенерированным

<property
  name="P1"
  type="int" />
<property
  name="P2"
  type="string" />

Build

var doc = new System.Xml.XmlDocument();
doc.LoadXml(generatedXml);

new NHibernate.Cfg.Configuration()
    .AddDocument(doc)
...
    .BuildSessionFactory();

Запрос

var query = session.CreateCriteria<Fact>();

foreach (var restriction in restrictions)
{
    query.Add(Restrictions.Eq(restriction.Name, restriction.Value))
}

var facts = query.List<Fact>();

SendBack(facts);

создание / удаление таблицы

var dialect = Dialect.GetDialect(config.Properties);
var defaultCatalog = PropertiesHelper.GetString(NHibernate.Cfg.Environment.DefaultCatalog, config.Properties, null);
var defaultSchema = PropertiesHelper.GetString(NHibernate.Cfg.Environment.DefaultSchema, config.Properties, null);

var createTableSql = config.GetClassMapping(typeof(Fact)).Table.SqlCreateString(dialect, config.BuildMapping(), defaultCatalog, defaultSchema);
var dropTableSql = config.GetClassMapping(typeof(int)).Table.SqlDropString(dialect, defaultCatalog, defaultSchema);
...