2011-02-07 3 views
2

나와 나와 일하는 친구가 Entity Framework 4 CTP 5에서 코드 퍼스트 Fluent API를 사용하여 매핑을 정의하는 데 어려움을 겪고 있습니다. 누군가가 분명히 말한 바보 같은 실수를 지적하기를 바랍니다. . 다음은 관련 데이터베이스 설정입니다.Entity Framework 4 매핑 문제

Person 
------------ 
int PersonId (pk) 
varchar Name 

Contact 
-------------- 
int ContactId (pk) 
int ContactTypeId 
varchar Text 

따라서 사람은 0 개 이상의 전화 번호와 0 개 이상의 전자 메일 주소를 가질 수 있습니다. 전화 번호와 전자 메일 주소는 "Contact"테이블에 저장됩니다.이 테이블은 단순한 계층 별 테이블 상속 매핑 (유형 판별 자로 ContactTypeId 사용)입니다. 코드에서, 우리는이 :

public class Person { 
    public int PersonId { get; set; } 
    public string Name { get; set; } 
    public ICollection<Phone> Phones { get; set; } 
    public ICollection<Email> Emails { get; set; } 
} 

public abstract class Contact { 
    public int ContactId { get; set; } 
    public string Text { get; set; } 
    public Person Person 
} 

public class Phone : Contact {}  
public class Email : Contact {} 

... 그리고 데이터베이스 매핑 우리는이 :

public class ContactMapping : IFluentEntityFrameworkMapping 
{ 
    public void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     EntityTypeConfiguration<Contact> configuration = modelBuilder.Entity<Contact>(); 

     config.HasKey(c => c.ContactId) 
      .Map<Email>(e => e.Requires("ContactTypeId").HasValue(1)) 
      .Map<Phone>(p => p.Requires("ContactTypeId").HasValue(2)); 
    } 
} 

public class PersonMapping : IFluentEntityFrameworkMapping 
{ 
    public void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     EntityTypeConfiguration<Person> config = modelBuilder.Entity<Person>(); 

     config.HasMany(p => p.Phones).WithRequired(p => p.Person).HasForeignKey(p => p.PersonId); 
     config.HasMany(p => p.Emails).WithRequired(e => e.Person).HasForeignKey(e => e.PersonId); 
    } 
} 

우리는 우리가 단순히 당겨하려고하면,이 물건에 대해 간단한 단위 테스트를 실행하려고 전화 번호 나 이메일 주소의 콜렉션은 모두 정상입니다. 그러나 Person 컬렉션을 가져 오려고하면 매핑 오류가 발생합니다. 위의 코드 중 하나에 명백하게 잘못된 것이 있습니까? 어떤 도움을 사전에

감사합니다, KurtC

답변

3

예외는 Contact 클래스에 하나의 엔드 포인트와 2 개 연결을 만들려고한다는 사실에서 비롯됩니다. 즉, Contact.PersonPerson.PhonesPerson.Emails에 대한 역 특성으로 EF CTP5 이상에서는 가능하지 않습니다. 이 문제를 해결할 수있는 방법은 다음과 같습니다.

public class Person 
{ 
    public int PersonId { get; set; } 
    public string Name { get; set; }     
    public ICollection<Contact> Contacts { get; set; } 
} 

public abstract class Contact 
{ 
    public int ContactId { get; set; } 
    public string Text { get; set; } 
    public int PersonId { get; set; }   
    public Person Person { get; set; } 
} 

public class Phone : Contact { } 
public class Email : Contact { } 

public class Context : DbContext 
{ 
    public DbSet<Contact> Contacts { get; set; } 
    public DbSet<Person> Persons { get; set; } 
    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Contact>() 
        .Map<Email>(e => e.Requires("ContactTypeId").HasValue(1)) 
        .Map<Phone>(p => p.Requires("ContactTypeId").HasValue(2)); 

     modelBuilder.Entity<Person>() 
        .HasMany(p => p.Contacts) 
        .WithRequired(e => e.Person) 
        .HasForeignKey(e => e.PersonId); 
    } 
}