2011-02-07 7 views
2

У меня и моего друга на работе возникают определенные трудности с определением сопоставления в Entity Framework 4 CTP 5 с использованием API Code First Fluent, и я надеялся, что кто-то может указать на какую-то очевидную туманную ошибку, которую мы делаем , Вот соответствующая настройка базы данных:Проблема с сопоставлением объектов Entity Framework 4

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

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

Таким образом, у человека могут быть ноль или более номеров телефонов и ноль или более адресов электронной почты. Телефон и адреса электронной почты хранятся в таблице «Контакты», которая является простым сопоставлением наследования на основе иерархии на основе иерархии (с 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); 
    } 
} 

Когда мы пытаемся запустить простые модульные тесты против этого материала, если мы просто попытаться вытащить задние коллекции телефонных номеров или адресов электронной почты, все хорошо. Но если мы попытаемся собрать коллекцию Лица, мы получим ошибки отображения. Есть ли что-то явно неправильное с любым из вышеуказанного кода?

Заранее спасибо за любую помощь, KurtC

ответ

3

за исключением исходит из того, что вы пытаетесь создать 2 ассоциации с одной конечной точки на контактном класса. Другими словами, Contact.Person является инверсным свойством как для Person.Phones, так и для Person.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); 
    } 
} 
Смежные вопросы