2010-08-12 2 views
0

Ok 오브젝트와 외래 키가 2 개 있습니다.FluentNHibernate ForeignKey 제약을 사용하는 일대일

첫 번째 개체는입니다.

public class OutboundEmailMap : ClassMap<OutboundEmail> 
{ 
    public OutboundEmailMap() 
    { 
     Table("OutboundEmail"); 

     Id(x => x.Id, "OutboundEmailId") 
      .UnsavedValue(0) 
      .GeneratedBy.Identity(); 

     Map(x => x.OutboundEmailGuid); 
     Map(x => x.FromAccountName); 
     Map(x => x.ToAccountName); 
     Map(x => x.FromContactFirstName); 
     Map(x => x.FromContactLastName); 
     Map(x => x.ToContactFirstName); 
     Map(x => x.ToContactLastName); 
     Map(x => x.FromEmailAddress); 
     Map(x => x.ToEmailAddress); 
     Map(x => x.EmailTemplateID); 
     Map(x => x.SentDate); 
     Map(x => x.Subject); 
     Map(x => x.XMLTokenDictionary); 
     Map(x => x.IsFax); 
     Map(x => x.TransmittalId); 

     //References<Transmittal>(x => x.Transmittal) 
     // .Column("TransmittalID") 
     // .LazyLoad() 
     // .Cascade.None(); 

     HasOne<OutboundEmailStatus>(x => x.Status) 
      .ForeignKey("FK_OutboundEmailStatus_OutboundEmail") 
      .Cascade.None(); 
    } 
} 

제 2 클래스

public class OutboundEmailStatusMap : ClassMap<OutboundEmailStatus> 
{ 
    public OutboundEmailStatusMap() 
    { 
     Table("OutboundEmailStatus"); 

     Id(x => x.Id, "OutboundEmailStatusID") 
      .UnsavedValue(0) 
      .GeneratedBy.Identity(); 

     References(x => x.OutboundEmail, "OutboundemailID"); 
     Map(x => x.EmailStatus, "EmailStatusID"); 
     Map(x => x.EmailStatusDate); 
    } 
} 

입니다 그리고 외래 키는

USE [Mail] 
GO 

ALTER TABLE [dbo].[OutboundEmailStatus] WITH CHECK ADD CONSTRAINT [FK_OutboundEmailStatus_OutboundEmail] FOREIGN KEY([OutboundEmailID]) 
REFERENCES [dbo].[OutboundEmail] ([OutboundEmailID]) 
GO 

ALTER TABLE [dbo].[OutboundEmailStatus] CHECK CONSTRAINT [FK_OutboundEmailStatus_OutboundEmail] 
GO 

입니다 그리고 마지막으로이 그래서 문제가

SELECT top 20 this_.OutboundEmailId    as Outbound1_1_1_, 
      this_.OutboundEmailGuid   as Outbound2_1_1_, 
      this_.FromAccountName    as FromAcco3_1_1_, 
      this_.ToAccountName    as ToAccoun4_1_1_, 
      this_.FromContactFirstName   as FromCont5_1_1_, 
      this_.FromContactLastName   as FromCont6_1_1_, 
      this_.ToContactFirstName   as ToContac7_1_1_, 
      this_.ToContactLastName   as ToContac8_1_1_, 
      this_.FromEmailAddress    as FromEmai9_1_1_, 
      this_.ToEmailAddress    as ToEmail10_1_1_, 
      this_.EmailTemplateID    as EmailTe11_1_1_, 
      this_.SentDate      as SentDate1_1_, 
      this_.Subject      as Subject1_1_, 
      this_.XMLTokenDictionary   as XMLToke14_1_1_, 
      this_.IsFax      as IsFax1_1_, 
      this_.TransmittalId    as Transmi16_1_1_, 
      outboundem2_.OutboundEmailStatusID as Outbound1_7_0_, 
      outboundem2_.EmailStatusID   as EmailSta2_7_0_, 
      outboundem2_.EmailStatusDate  as EmailSta3_7_0_, 
      outboundem2_.OutboundemailID  as Outbound4_7_0_ 
FROM  OutboundEmail this_ 
    left outer join OutboundEmailStatus outboundem2_ 
     on this_.OutboundEmailId = outboundem2_.OutboundEmailStatusID 
WHERE this_.TransmittalId = '7789322e-acd6-4cb8-9c43-5bdaec52aa8a' /* @p0 */ 
ORDER BY this_.ToAccountName asc 

생성 된 쿼리입니다 보시다시피, 이유가 무엇이든간에 외래 키를 OutboundEmailID 대신 OutboundEmailStatusID에 연결하더라도 외래 키를 사용하려고 시도합니다.

이 문제가 발생할 수있는 이유 또는 다른 방법을 알고있는 분은 알려 주시기 바랍니다.

내게도 이것이 어리석은 것처럼 보입니다.

답변

2

NHibernate의 one-to-one은 의도적으로 기본 키를 조인하는 관계입니다. 두 엔티티가 두 값이 같은 값을 갖는 경우 묵시적 규칙을 통해서만 두 엔티티가 관련된다는 점에서 명시 적 관계 라기보다는 암시적인 관계입니다. 참조 : NHibernate one-to-one.

데이터베이스 설계로 판단 할 때 일대 다 관계 구조가 실제로는 일대일 관계 구조가 아닙니다. 귀하의 도메인 모델은 일대일로 표현할 수 있지만 기본은 여전히 ​​일대 다입니다. 데이터베이스에서 동일한 외래 키 값을 갖는 여러 행을 중지시키는 것이 없기 때문에 OutboundEmail은 많은 OutboundEmailStatus를 가질 수 있습니다.

개인적으로 나는 그것을 뒤집어 OuboundEmail에 외래 키를 넣었습니다. 그렇게하면 OutboundEmail은 OutboundEmailStatus에 대해 다 대일이됩니다. 일명. 이메일은 단일 상태이지만 상태는 여러 이메일과 연관 될 수 있습니다.

+0

예, 우리는 OutboundEmail 테이블에 키를 넣는 것에 대해 이야기하고있었습니다. 귀하의 의견을 보내 주셔서 감사 드리며 많은 의미가 있습니다. – MattB

+0

그리고 나는 투표 할만한 충분한 평판이 없다고 생각한다. ( – MattB