首先,我看了this article,this one和this one,但我还有一个问题。因此,我需要一个具体的C#解决方案来解决使用任何此解决方案截断的问题:IUserType,拦截或ValidationDef。我想声明像这样的字段:
public class MyEntity {
[Truncate(length=255)]
public virtual string Comments { get; set; }
}
我需要在更新/保存NHibernate操作之前自动截断字符串行。在这种情况下,我不会得到一个exeption System.Data.SqlClient.SqlErrorCollection
字符串或二进制数据将被截断
答案 0 :(得分:4)
老实说,最简单,最易读的解决方案是让课程处理它。像这样:
public class MyEntity {
private string comments;
public virtual string Comments {
get {return comments;}
set {comments = str.Substring(0, Math.Min(value.Length, 255))};
}
}
但我不认为这就是你所要求的。除此之外,您可以使用具有多种方法(如OnSave)的IInterceptor执行某些操作。你需要为这个方法编写类似的东西(注意这是Psudo代码,因为它有很多东西!):
public boolean OnSave(object entity,
object id,
object[] state,
string[] propertyNames,
IType[] types)
{
for ( int i=0; i<propertyNames.Length; i++ )
{
if ( objectHasAttributeOnproperty(propertyNames[i], Truncate))
{
trucate(entity, propertyNames[i])
return true;
}
}
return true;
}
然后使用hibernate会话注册拦截器。保存的每个实体都将通过它并检查是否需要截断的字符串。
以下是NHibernate中拦截器的文档: http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-interceptors
检查堆栈溢出以获取属性值并通过反射调用属性设置器。