2011-01-23 2 views
4

관계가 지정되지 않았 음을 나타 내기 위해 0 값이 FK 열에서 사용되는 레거시 데이터베이스가 있습니다.nhibernate, 외래 키 열에서 0

이것은 사소한 방식으로 변경할 수있는 것이 아닙니다. NHibernate에게 0을 지정된 열에서 null로 처리하도록 할 수 있습니까?

편집

이 나는 ​​약 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합니다. 노엘 케네디 (Noel Kennedy)가 흥미롭지 만 조금 이상한 해결책이 있습니다.

아마도 데이터베이스에 ID가 0 인 레코드를 저장할 것입니다.이 레코드는 Null 개체를 나타냅니다.