私と職場の友人は、Code First Fluent API を使用して Entity Framework 4 CTP 5 でマッピングを定義するのに苦労しています。関連するデータベースの設定は次のとおりです。
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