NHibernateを使用してマッピングされたエンティティを保存しようとしましたが、基になるテーブルにNULLを許可しないカラムがあり、それがマッピングされていないのは、問題の列がレガシーアプリケーションをサポートしており、アプリケーションとの関連性がないからです。そのため、レガシープロパティでエンティティを汚染しないようにします。NHibernateはインターセプタのマッピングされていないカラムを追加します
私は私のクラスの中でプライベートフィールドを使うことができると知っていますが、これはまだ私にとっては厄介です。 read私はNHibernateインターセプタを使用し、OnSave()メソッドをオーバーライドして、エンティティが保存される直前に新しい列を追加することができます。これは、私のインターセプターのOnSaveのtypesパラメーターにNhibernate.type.ITypeのインスタンスを追加する方法を試すことができないため、難しいことです。
私のエンティティは、おおよそ次のようになります。
public class Client
{
public virtual int Id { get; set; }
public virtual int ParentId { get; set; }
public virtual string Name { get; set; }
public virtual string Phone { get; set; }
public virtual string Email { get; set; }
public virtual string Url { get; set; }
}
そして、私の迎撃
public class ClientInterceptor : EmptyInterceptor
{
public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
{
if (entity is Client)
{
/*
manually add the COM_HOLD column to the Client entity
*/
List<string> pn_list = propertyNames.ToList();
pn_list.Add("COM_HOLD");
propertyNames = pn_list.ToArray();
List<Object> _state = state.ToList();
_state.Add(false);
state = _state.ToArray();
//somehow add an IType to types param ??
}
return base.OnSave(entity, id, state, propertyNames, types);
}
}
誰もが適切にこれを行う方法上の任意のアイデアを持っていますか?
私は恐らくNHibernate.Type.BooleanTypeであり、その名前空間内の他のものはすべて、通常の方法で新しい名前空間には不可能な私的なコンストラクタを持っています。私はあなたがオブジェクトを作成するためにいくつかの他のNHibernate APIを使用する必要があると思います。 –
NHibernateUtil.Booleanを試してみてください。 –
ありがとうスチュアート - それはトリックをしました。自分のエンティティクラスからプライベートフィールドを削除しました。テーブルに問題なく挿入できます。 –