Проблема отображения Entity Framework 4 - PullRequest
2 голосов
/ 08 февраля 2011

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

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

1 Ответ

3 голосов
/ 08 февраля 2011

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