在Fluent NHibernate中自动截断字符串

时间:2012-12-09 14:28:27

标签: c# .net sql-server nhibernate fluent-nhibernate

首先,我看了this articlethis onethis one,但我还有一个问题。因此,我需要一个具体的C#解决方案来解决使用任何此解决方案截断的问题:IUserType,拦截或ValidationDef。我想声明像这样的字段:

public class MyEntity {
    [Truncate(length=255)]
    public virtual string Comments { get; set; }
}

我需要在更新/保存NHibernate操作之前自动截断字符串行。在这种情况下,我不会得到一个exeption System.Data.SqlClient.SqlErrorCollection

  

字符串或二进制数据将被截断

1 个答案:

答案 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

检查堆栈溢出以获取属性值并通过反射调用属性设置器。