1

まず、この記事これこれを読みましたが、まだ質問があります。したがって、IUserType、interceptation、またはValidationDefのいずれかのソリューションを使用して切り捨ての問題を解決する具体的なC#ソリューションが必要です。このようなフィールドを宣言したい:

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で何かを行うことができます。メソッドには次のようなものを書く必要があります(これはたくさんのものがあるので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;
    }

次に、インターセプターを休止状態セッションに登録します。保存されたすべてのエンティティはそれを通過し、切り捨てが必要な文字列がないかチェックされます。

NHibernateのインターセプターに関するドキュメントは次のとおりです:http: //www.nhforge.org/doc/nh/en/index.html#manipulatingdata-interceptors

スタックオーバーフローをチェックして、属性値を取得し、リフレクションを介してプロパティセッターを呼び出します。

于 2012-12-10T01:27:35.927 に答える