null関係を保存するときに0を保存するタプリザーのこの例を見つけました。これは、レガシーデータベーススキーマのアプリで作業しているために必要です。
ここでタプリザーを試しました:http://nhforge.org/blogs/nhibernate/archive/2011/01/28/how-to-use-0-instead-of-null-for-foreign-keys.aspx
その例では、ProxyFactoryのnullreferenceexceptionを取得しました。次に、ここでコードの更新を見つけました:https ://bitbucket.org/jfromaniello/hotgazpachoeg/changeset/87ac41c473ae
しかし、それは私にとってもうまくいきません。最後のメソッドであるSetPropertyValues(DBからオブジェクトを読み取るときに使用されるダーティハック3として説明)では、関連のないオブジェクト(サンプルではない)を読み取るときに、この部分でnullref例外が発生しますif(typeof(IEntity))
私のマッピングは次のとおりです(簡略化):
Table("ej_sample");
Not.LazyLoad();
Id(s => s.Id, "sampleID").GeneratedBy.Native();
References<Sample>(s => s.ParentSample, "parentSampleID").NotFound.Ignore();
そのようなオブジェクトが存在しない場合、parentSampleID列は0でなければなりません。
私は、挿入と更新でダーティハックを実行するだけでよいと考えました(おそらく私の場合は挿入のみです)。
挿入時に、偽のプロキシを作成したいのですが、[2]のコードは、データベースからエンティティをロードします(Nullオブジェクトを使用する可能性がありますか?!)。
ダーティハックを挿入します。
public override object[] GetPropertyValuesToInsert(object entity, IDictionary mergeMap, ISessionImplementor session) {
var values = base.GetPropertyValuesToInsert(entity, mergeMap, session);
//dirty hack 1
for(int i = 0; i < values.Length; i++) {
if(values[i] == null && typeof(IEntity).IsAssignableFrom(getters[i].ReturnType)) {
values[i] = ((ISession)session).Load(getters[i].ReturnType, 0);
}
}
return values;
}
上記の代わりに、偽のプロキシを作成してみました。
public override object[] GetPropertyValuesToInsert(object entity, IDictionary mergeMap, ISessionImplementor session) {
var values = base.GetPropertyValuesToInsert(entity, mergeMap, session);
//dirty hack 1
for(int i = 0; i < values.Length; i++) {
if(values[i] == null && typeof(IEntity).IsAssignableFrom(getters[i].ReturnType)) {
//values[i] = ((ISession)session).Load(getters[i].ReturnType, 0);
values[i] = CreateFakeProxy(i);
}
}
return values;
}
private object CreateFakeProxy(int i) {
object proxy;
using(var sessionImplementor = _sessionFactory.OpenSession()) {
proxy = _sessionFactory
.GetEntityPersister(getters[i].ReturnType.FullName)
.CreateProxy(0, (ISessionImplementor)sessionImplementor);
}
return proxy;
}
次に、ctorで設定されている_sessionfactoryでnullref例外が発生します。
private readonly ISessionFactoryImplementor _sessionFactory;
public NullableTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity)
: base(entityMetamodel, mappedEntity) {
_sessionFactory = entityMetamodel.SessionFactory;
}
これを達成する方法はありますか?