通过NHibernate元数据查找基础列大小

通过NHibernate元数据查找基础列大小,nhibernate,size,metadata,Nhibernate,Size,Metadata,有没有一种方法可以使用SessionFactory.GetClassMetadata(),或者您知道的任何其他方法来动态获取NHibernate类的字符串属性下的varchar列的最大大小 为了澄清,我不想读取NHibernate映射文件中指定的长度属性。我想推断实际的数据库列长度。生成会话工厂时,NH引擎不会检查(并检索)底层数据库是什么。对于您的情况,您可以提供一个“丰富”的映射,使所有内容在运行时都可用,或者在需要时创建一个函数,从数据库中读取必要的信息(即select*from sys.

有没有一种方法可以使用
SessionFactory.GetClassMetadata()
,或者您知道的任何其他方法来动态获取NHibernate类的字符串属性下的
varchar
列的最大大小


为了澄清,我不想读取NHibernate映射文件中指定的长度属性。我想推断实际的数据库列长度。

生成会话工厂时,NH引擎不会检查(并检索)底层数据库是什么。对于您的情况,您可以提供一个“丰富”的映射,使所有内容在运行时都可用,或者在需要时创建一个函数,从数据库中读取必要的信息(即select*from sys.columns…..对于sql server)


请注意,丰富的映射还允许NH引擎进行一些自动化操作(例如检查传递的字符串的大小是否大于(n)varchar列的长度)

请参阅下面的代码,了解从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));
    }