2011-03-10 4 views
0

죄송합니다. 내 뇌가 지금 튀겨지면 죄송합니다. 난 그냥, NHibernate에 프로그래밍을 시작하기 때문에 자동 매핑의 유창함 NHibernate에로 이동하기로 결정하지만 약간의 문제가있어, 여기의 관계입니다 그것은이 있어야합니다 여기 Fluent NHibernate atutomapping, 간단한 질문, 외래 키 관계에 대한 추가 필드가 추가되었습니다

enter image description here

는 관계 유창함 자 NHibernate의 자동 매핑입니다 테이블에 MemberId가 추가 된 것을 확인하십시오. enter image description here

관계가 내 규칙에서 역으로 설정 되었기 때문에이 값을 추측 할 수 있습니다. 관계를 inverse()로 만들거나 캐스케이드가 작동하지 않게해야했습니다. 여기 내 규칙은 다음과 같습니다

public class HasManyConvention : IHasManyConvention 
    { 
     public void Apply(FluentNHibernate.Conventions.Instances.IOneToManyCollectionInstance instance) 
     { 
      instance.Key.Column(instance.EntityType.Name + "ID"); 
      //instance.Inverse(); 
      if (instance.Member.GetCustomAttributes(typeof(CascadeAttribute), false).Length <= 0) 
      { 
       instance.Cascade.None(); 
       return; 
      } 
      var cascadeOption = (CascadeAttribute)instance.Member.GetCustomAttributes(typeof(CascadeAttribute), false)[0]; 
      switch (cascadeOption.CascadeOption) 
      { 
       case Enums.CascadeOptions.All: 
        instance.Cascade.All(); 
        break; 

       case Enums.CascadeOptions.AllDeleteOrphan: 
        instance.Cascade.AllDeleteOrphan(); 
        break; 

       case Enums.CascadeOptions.Delete: 
        instance.Cascade.All(); 
        break; 

       case Enums.CascadeOptions.DeleteOrphan: 
        instance.Cascade.DeleteOrphan(); 
        break; 


       case Enums.CascadeOptions.None: 
        instance.Cascade.None(); 
        break; 

       case Enums.CascadeOptions.SaveUpdate: 
        instance.Cascade.SaveUpdate(); 
        break; 
      } 

     } 
    } 



public class ReferenceConvention : IReferenceConvention 
    { 
     public void Apply(FluentNHibernate.Conventions.Instances.IManyToOneInstance instance) 
     { 
      instance.Column(instance.Property.Name + "Fk"); 
      if (Attribute.IsDefined(instance.Property.PropertyType.Assembly, typeof(DomainSignatureAttribute))) 
       instance.UniqueKey("DomainSignature"); 
      else 
       instance.Index(instance.Property.Name + "Index"); 
     } 
    } 

그리고 내 두 엔티티 :

public class Member : Entity 
    { 
     public Member() 
     { 

      Mail = new List<Mail>(); 
     } 


     [Cascade(Enums.CascadeOptions.All)] 
     public virtual IList<Mail> Mail 
     { 
      get; set; 
     } 



    } 


public class Mail : Entity 
    { 

     public virtual Member Receiver 
     { 
      get; set; 
     } 

     public virtual Member Sender 
     { 
      get; set; 
     } 

     public virtual string Subject 
     { 
      get; 
      set; 
     } 

     public virtual string Body 
     { 
      get; set; 
     } 
    } 

이유는 무엇입니까는 수신기와 발신자는 회원 테이블에 외래 키는 것을 분명 능통 자 NHibernate 맵 MEMBERID?

답변

1

Member.Mail이 메일에 외래 키가되는 일대 다로 매핑되기 때문에. 아무도 'Member.Mail'은 역 관계이고 아무도 외래 키가 호출되는 방법을 언급하지 않았습니다. 그래서 표준 외래 키를 만듭니다.

+0

@Eitan, 그는 당신이 결코 그 관계가 어떻게 매핑되어야 하는지를 명시하지 않았다는 것을 의미합니다. 그래서 그것은 관습에 따라 MemberId를 호출하는 표준 외래 키를 가정합니다. – Vadim

+0

@Eitan : Inverse는 관계가 다른 관계에 중복되므로 저장 될 필요가 없음을 의미합니다. 그것은 데이터베이스 모델을 변경하지 않지만 양방향 참조를 원할 경우 inverse를 사용해야합니다. –

관련 문제