【问题标题】:Find Underlying Column Size Via NHibernate Metadata通过 NHibernate 元数据查找基础列大小
【发布时间】:2009-12-23 00:10:30
【问题描述】:

有没有办法使用SessionFactory.GetClassMetadata() 或您知道的任何其他方法来动态获取作为NHibernate 类的字符串属性基础的varchar 列的最大大小?

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

【问题讨论】:

    标签: nhibernate size metadata


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢,捷豹。您所说的丰富映射是指包含与数据库列大小相对应的长度属性的映射吗?
      • 是的,顺便说一句,对我的回答发表评论会提醒我您的评论。答案不得用于讨论
      猜你喜欢
      • 1970-01-01
      • 2010-12-18
      • 2012-05-02
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多