1

首先,我读了这篇文章这篇文章和这篇文章,但我仍然有一个问题。所以我需要一个具体的 C# 解决方案来解决使用以下任何解决方案截断的问题: IUserType、拦截或ValidationDef。我想声明这样的字段:

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

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

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

4

1 回答 1

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 执行某些操作。您需要为该方法编写类似的内容(注意这是伪代码,因为它有很多东西!):

    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;
    }

然后使用休眠会话注册拦截器。保存的每个实体都将通过它并检查需要截断的字符串。

这是NHibernate中拦截器的文档: http ://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-interceptors

检查 Stack Overflow 以获取属性值并通过反射调用属性设置器。

于 2012-12-10T01:27:35.927 回答