我有简单的拦截器OnSave()
,我试图为字符串属性获取SQL长度,例如:
public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types)
{
for (int i = 0; i < propertyNames.Length; i++)
{
//If type is string
var stringType = types[i] as NHibernate.Type.StringType;
if(stringType != null)
{
//Get SQL length of string property
var length = stringType.SqlType.Length;
}
}
return false;
}
我前几天已经问过这个问题here,我从中获得了帮助,从上面编写代码并阅读SQL长度。
现在我有一个问题。据我所知,这个长度并不代表DB中的实际长度,它表示Nhibernate映射中设置的属性长度,对我来说没问题。
所以如果我在映射中有这个:
mapping.Map(x => x.Name).Length(600);
在数据库中,这会转换为长度为TEXT
65,535
字段
但上面的代码将从映射返回长度:
var length = stringType.SqlType.Length; == (600)
如果没有在映射中设置属性长度,那么在DB中它会转换为VARCHAR(100)
并且在拦截器中使用上面的代码我得到了正确length = 100
问题是如果我在映射集CustomSqlType("longtext")
中将属性转换为DB中的LONGTEXT:
mapping.Map(x => x.Content).CustomSqlType("longtext");
这会将DB中的属性Content
转换为LONGTEXT
,但是在上面代码的拦截器中,我仍然会获得该属性的length = 100
,就像任何未明确设置长度的其他属性一样映射。
我的问题是:有没有办法在Nhibernate Interceptor中读取真正的DB属性长度。
如果不是,那么有没有办法在Interceptor中读取CustomSqlType
属性。
阅读上面例子中的属性长度对我来说没问题,只要我能够阅读CustomSqlType
为映射中的属性设置并读取CustomSqlType
。