2012-05-29 2 views
2

저는 EF 코드 첫 번째 모델의 초보자에 지나지 않습니다. 현재 레거시 MS SQL 데이터베이스에 매핑 된 두 개의 POCO 클래스가 제공됩니다. 그것들은 일대 다 관계를 설정하는 복합 외래 키와 관련이있다. 실제로는 일대일 관계이므로 POCO 객체에서 해당 탐색 속성을 사용하고 유창한 API로 매핑하고 싶습니다. 여기 내 예입니다유창한 API를 사용하여 레거시 데이터베이스에서 일대일 관계로 복합 외래 키를 설정하십시오.

public partial class Answer 
{ 
    //primary key 
    public int id { get; set; } 

    //foreign keys 
    public int question { get; set; } 
    public int assignedForm { get; set; } 

    //simple fields 
    public short state { get; set; } 
    public int author { get; set; } 

    //navigation property 
    public virtual AssignedQuestion AssignedQuestion { get; set; } 
} 

public partial class AssignedQuestion 
{ 
    // primary keys 
    public int id { get; set; } 
    public int assignedForm { get; set; } 

    //simple field 
    public string content { get; set; } 

    //navigation property 
    //public virtual ICollection<Answer> Answers { get; set; } 
    public virtual Answer Answer { get; set; } 
} 

나는 일대 다 관계를하고 싶어하면 나는 것 간단히 주석 "답변"를 수집하고 있습니다 유창함 API 매핑 :

modelBuilder.Entity<AssignedQuestion>() 
    .HasKey(q => new { q.id, q.assignedForm }); 

modelBuilder.Entity<Answer>() 
    .HasRequired(a => a.AssignedQuestion) 
    .WithMany(aq=>aq.Answers) 
    .HasForeignKey(a => new { a.question,a.assignedForm}); 

내 목표는 함께 가야하는 것입니다 일대일의 관계와 같은 유창함 API와 AssignedQuestion에 "대답"속성을 사용

modelBuilder.Entity<AssignedQuestion>() 
    .HasKey(q => new { q.id, q.assignedForm }); 

modelBuilder.Entity<Answer>() 
    .HasRequired(a => a.AssignedQuestion) 
    .WithOptional(aq => aq.Answer); 
    //.HasForeignKey(a => new { a.question, a.assignedForm }); 

문제는 내가 (이전의 예에서와 같이) 정확히 외래 키 필드를 지정할 수 있으며 주석 HasFore ignKey 호출. 이 경우 EF는 응답 테이블의 "question"및 "assignedForm"대신 "AssignedQuestion_ID"및 "AssignedQuestion_AssignedForm"필드를 사용하여 테이블을 조인하려고합니다. 필드 이름을 변경하는 것 외에 Fluent API에 대한 해결책이 있습니까?

답변

2

첫 번째 매핑이 일대일 관계가 아니므로 일대일 관계가 아닙니다. 이것이 일대 다 (one-to-many) 이유는 EF가 양측의 PK를 기반으로 할 때만 일대일을 이해한다는 것입니다. AssignedQuestion이 PK idassignedForm 인 경우 AnsweridassignedForm에 FK 및 PK가 있어야합니다. 그렇지 않으면 EF가 일대일 관계로 간주하지 않습니다. questionassignedForm을 데이터베이스에 고유 한 constaint로 표시하더라도 (데이터베이스에서 일대일로 만들기 위해) 고유 한 제약 조건을 아직 지원하지 않기 때문에 EF는 여전히이를 일대일로 처리 할 수 ​​없습니다 (PK 제외).