4

データベース内の一部のオブジェクトは、存在しないリレーションシップに 0 を使用します。そこで、NullableTuplizer クラスをセットアップします。このコードをオンラインで見つけました。これまでのところ機能していますが、問題に気付きました。エンティティが選択された直後にダーティになるという大きな問題がありました。そのため、このオブジェクトに対する Get() の直後に、そのオブジェクトはダーティであり、NHibernate はそれをデータベースに保存しようとします。

これらの「マッピングの問題」を防止しようとしています。本当に汚れていないことを知らせる方法を知っている人はいますか?

public class NullableTuplizer : PocoEntityTuplizer
{
    public NullableTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity)
        : base(entityMetamodel, mappedEntity)
    {
    }

    public override object[] GetPropertyValuesToInsert(
        object entity, IDictionary mergeMap, ISessionImplementor session)
    {
        object[] values = base.GetPropertyValuesToInsert(entity, mergeMap, session);
        //dirty hack 1
        for (int i = 0; i < values.Length; i++)
        {
            if (values[i] == null && typeof(BaseEntity).IsAssignableFrom(getters[i].ReturnType))
            {
                values[i] = ProxyFactory.GetProxy(0, null);
            }
        }
        return values;
    }

    public override object[] GetPropertyValues(object entity)
    {
        object[] values = base.GetPropertyValues(entity);
        //dirty hack 2
        for (int i = 0; i < values.Length; i++)
        {
            if (values[i] == null && typeof(BaseEntity).IsAssignableFrom(getters[i].ReturnType))
            {
                values[i] = ProxyFactory.GetProxy(0, null);
            }
        }
        return values;
    }


    public override void SetPropertyValues(object entity, object[] values)
    {
        //dirty hack 3.
        for (int i = 0; i < values.Length; i++)
        {
            dynamic val = values[i];
            if (typeof(BaseEntity).IsAssignableFrom(getters[i].ReturnType) && val.Id == 0)
            {
                values[i] = null;
            }
        }
        base.SetPropertyValues(entity, values);
    }
}
4

1 に答える 1