5

特別なプロパティを持つドメインクラスを拡張せずにNHibernateを介してエンティティを更新/挿入するときに、いくつかの特別な列値を設定するにはどうすればよいですか?

例:私の場合、オブジェクトを取得し、データベースを更新/挿入する直前に、IInterceptorを使用してそのオブジェクトにいくつかの追加情報(ユーザーIDやコンピューター名など)を追加します。つまり、元のオブジェクトのクラスに新しいプロパティを指定せずに、DBテーブルにいくつかの列を追加したいと思います。その場合、自分Object.hbm.xmlまたはApp.configに構成/変更/追加する必要がありますか?

問題は、元のオブジェクトと基本クラスを変更できないことです。したがって、元のオブジェクトを変更せずに(基本クラスから継承していなくても)、可能であればDBテーブルに情報を追加する必要があります。

例:

元のオブジェクトには:FirstName ,LastName,Birthday,Address properties

Customer.hbm.xmlもっている:

<property name="FirstName" column="FirstName" type="string" not-null="true" length="64" />
<property name="LastName" column="LastName" type="string" not-null="true" length="64" />
<property name="Birthday" column="Birthday" type="DateTime" not-null="true"  />
<property name="Address" column="Address" type="string" not-null="true"  />

私のInterceptorクラスには次のメソッドがあります。

public bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)

その時点で、または保存する前に、DB Customerテーブルに追加の2つの列(たとえば、コンピューター名とユーザー名)を追加する必要があります。これらの列propertyNames[]state[]パラメーターには最初からそれらがないため、その場で実行する必要があります。

MY DB Customerテーブルには、上記で説明したすべての列があります。

ありがとうございました。

4

1 に答える 1

1

試したことはありませんが、工場で作成する前に、動的プロパティを構成に追加できるはずです。次に、これらの値をインターセプターに入力できます。

たとえば、config.ClassMappingsから関連するPersistentClassを取得し、それにプロパティを追加します。

private void AddProperty(
        PersistentClass pc, 
        string propertyName, 
        string columnName, 
        IType dataType)
    {
        SimpleValue val = new SimpleValue(pc.Table);
        Column col = new Column(dataType, 0);
        col.Name = columnName;
        val.AddColumn(col);
        val.Type = dataType;
        Property prop = new Property(val);
        prop.IsUpdateable = true;
        prop.Name = propertyName;
        prop.PropertyAccessorName = "nosetter.camelcase";
        prop.Cascade = "none";
        pc.AddNewProperty(prop);
    }
于 2013-01-16T00:15:09.997 に答える