NHibernateを使用してマップされたエンティティを保存しようとしていますが、基になるテーブルにnullを許可しない列があり、ドメインオブジェクトにマップされていないため、データベースへの挿入が失敗します。マップされていない理由は、問題の列がレガシーアプリケーションをサポートしており、アプリケーションとの関連性がないためです。したがって、レガシープロパティでエンティティを汚染したくないのです。
クラス内でプライベートフィールドを使用できることはわかっていますが、それでも私には不快感を覚えます。NHibernateインターセプターを使用し、OnSave()メソッドをオーバーライドして、エンティティが保存される直前に新しい列を追加できることを読みました。Nhibernate.type.ITypeのインスタンスをインターセプターのOnSaveのtypesパラメーターに追加する方法がわからないため、これは難しいことがわかります。
私のエンティティは大まかに次のようになります。
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);
}
}
誰かがこれを適切に行う方法について何かアイデアがありますか?