2011-01-23 11 views
4

FK列で0の値が使用されていて、関係が指定されていないことを示す従来のデータベースがあります。nhibernate、0の外部キー列

これは私が簡単に変更できるものではありません。指定されたカラムで0をnullとして扱うようにNHibernateに指示することは可能ですか?

編集

私は約not-foundを知っているが、私はちょうど同様の質問があります0

+0

関係を追加できますか? 0のPKはFKが参照するテーブルに? – Mark

+0

いいえ、私は傾けません。すべてのコードでは、関係がない場合、モデルにはnullが含まれていると見なされます。 – jgauffin

答えて

0

このソリューションは、私たちのために素晴らしい仕事:要するにhttp://nhibernate.info/blog/2011/01/28/how-to-use-0-instead-of-null-for-foreign-keys.html

:次に

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 (IEntity).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 (IEntity).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++) 
     { 
      if (typeof (IEntity).IsAssignableFrom(getters[i ].ReturnType) 
       && ((IEntity) values[i ]).Id == 0) 
      { 
       values[i ] = null; 
      } 
     } 
     base.SetPropertyValues(entity, values); 
    } 
} 

すべての関連するマッピングのためにそれを登録します:

は以下のクラスを追加

foreach (var persistentClass in configuration.ClassMappings) 
{ 
    persistentClass.AddTuplizer(EntityMode.Poco, typeof(NullableTuplizer).AssemblyQualifiedName); 
} 
+0

あなたが提供したリンクは動作しません.. – jkyadav

0

を有するものを無視したい:NHibernate Saving 0 to many-to-one column instead of nullが。興味深いが、ノエル・ケネディーによるちょっと変わった解決策がある。

データベースにID 0のレコードが格納されている可能性があります。これはNullオブジェクトを表しています。

関連する問題