【发布时间】:2009-12-23 00:10:30
【问题描述】:
有没有办法使用SessionFactory.GetClassMetadata() 或您知道的任何其他方法来动态获取作为NHibernate 类的字符串属性基础的varchar 列的最大大小?
为了澄清,我不想读取 NHibernate 映射文件中指定的长度属性。我想推导出实际的数据库列长度。
【问题讨论】:
标签: nhibernate size metadata
有没有办法使用SessionFactory.GetClassMetadata() 或您知道的任何其他方法来动态获取作为NHibernate 类的字符串属性基础的varchar 列的最大大小?
为了澄清,我不想读取 NHibernate 映射文件中指定的长度属性。我想推导出实际的数据库列长度。
【问题讨论】:
标签: nhibernate size metadata
请参阅下面的代码,了解从 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));
}
【讨论】:
生成会话工厂时,NH 引擎不会检查(和检索)底层数据库是什么。对于您的情况,您可以提供“丰富”映射以使所有内容在运行时都可用,或者创建一个从数据库读取必要信息的函数(即 select * from sys.columns ..... for sql-server),当您需要它。
请注意,丰富的映射还允许 NH 引擎进行一些自动化操作(例如检查传递的字符串的大小是否大于 (n)varchar 列的长度)
【讨论】: