2011-02-07 17 views
2

私と職場の友人は、Entity Framework 4のCTP 5でコードファーストフルエントAPIを使用してマッピングを定義するのが難しく、誰かが明らかに間違っている間違いを指摘できると思っていました。関連するデータベースの設定は次のとおりです。Entity Framework 4マッピングの問題

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

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

したがって、人は0個以上の電話番号と0個以上の電子メールアドレスを持つことができます。電話番号と電子メールアドレスは、「連絡先」テーブルに格納されます。これは、単純な階層ごとの継承マッピング(タイプ識別子として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.Personは、少なくともEF CTP5の場合のように、Person.PhonesPerson.Emailsの逆特性ではありません。これを修正する方法の1つは次のとおりです。

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); 
    } 
} 
関連する問題