Найти размер базового столбца с помощью метаданных NHibernate

Есть ли способ использовать SessionFactory.GetClassMetadata() или любой другой известный вам метод для динамического получения максимального размера столбца varchar, лежащего в основе строкового свойства класса NHibernate?

Чтобы уточнить, я не собираюсь читать атрибут длины, указанный в файле сопоставления NHibernate. Я хочу определить фактическую длину столбца базы данных.


person Calvin Nguyen    schedule 23.12.2009    source источник


Ответы (2)


В приведенном ниже коде показаны два разных способа получения размера столбца для строки из метаданных NHib.

Ура,
Беррил

    [Test]
    public void StringLength_DefaultIs_50_v1()
    {
        _metadata = _SessionFactory.GetClassMetadata(typeof(User));
        var propertyType = _metadata.GetPropertyType("Email") as StringType;
        Assert.That(propertyType.SqlType.Length, Is.EqualTo(50));
    }

    [Test]
    public void StringLength_DefaultIs_50_v2()
    {
        var mapping = _Cfg.GetClassMapping(typeof(User));
        var col = mapping.Table.GetColumn(new Column("Email"));
        Assert.That(col.Length, Is.EqualTo(50));
    }
person Berryl    schedule 11.01.2010

Когда создается фабрика сеансов, механизм NH не проверяет (и не извлекает), что такое базовая база данных. В вашем случае вы либо предоставляете «богатое» сопоставление, чтобы все было доступно во время выполнения, либо создаете функцию, которая считывает необходимую информацию из БД (т.е. выберите * из sys.columns ..... для sql-server), когда вы нужно это.

Имейте в виду, что расширенное сопоставление также позволяет движку NH выполнять некоторую автоматизацию (например, проверять, больше ли размер переданной строки, чем длина столбца (n) varchar)

person Jaguar    schedule 24.12.2009
comment
Спасибо, Ягуар. Под расширенным отображением вы имеете в виду отображение, которое содержит атрибуты длины, соответствующие размерам столбцов базы данных? - person ; 24.12.2009
comment
да, кстати, комментируя мой ответ, я бы узнал о вашем комментарии. Ответы не должны использоваться для обсуждения - person Jaguar; 19.02.2010