私は非常に基本的なシナリオだと思うものをモデル化しようとしていますが、EF Code First 5 でそれを定義する正しい方法に頭を悩ませることができません。
私は3つのクラスを持っています:
従業員の住所 連絡先の電話番号
したがって、ルールは次のとおりです。
- 住所はスタンドアロンにすることができます
- 連絡先電話番号はスタンドアロンにすることができます
- オプションで、従業員は「自宅」の住所を持つことができます
- 従業員はゼロ以上の連絡先電話番号を持つことができます
これを SQL でモデル化すると、最終的に 4 つのテーブルになります。
- 郵便番号
- 連絡先電話番号
- 従業員
- EmployeeContactTelephoneNumber (ブリッジ テーブル)
ここで SO に関する回答を確認することで、Code First の SQL モデルに似たものを作成できますが、PostalAddress に Employee ナビゲーション プロパティを、ContactTelephoneNumber に Employees ナビゲーション プロパティを設定する必要があります。PostalAddress も ContactTelephoneNumber も常に Employee とは見なされないため、これは私のビジネス ルールに反します。たとえば、PostalAddress を持つ Premises クラスを後で追加できます。
コード例として、私が今持っているものは次のようになります。
public class Employee
{
public int EmployeeID {get;set;}
public virtual PostalAddress? HomeAddress {get;set;}
}
public class PostalAddress
{
public int PostalAddressID {get;set;}
public string Address {get;set;} // It's not actually a string - this is for brevity!
}
public class ContactTelephoneNumber
{
public int ContactTelephoneNumberID {get;set;}
public string TelephoneNumber {get;set;} // It's not actually a string - this is for brevity!
}
注釈ではなく Fluent API を使用して関係を定義しようとしています。これにより、これらのクラスを使用するときにプレゼンテーション レイヤーが Entity Framework を認識しないようにします。現在、私のマッピングは次のようになっています。これは「正しい」ものですか?
public class EmployeeMap : EntityTypeConfiguration<Employee>
{
public EmployeeMap()
{
this.HasOptional(e => e.HomeAddress).WithOptionalDependent(p => p.Value).Map(m => m.MapKey("PostalAddressID"));
}
}
これはコンパイルされません。私は得る:
タイプ「PostalAddress?」ジェネリック型またはメソッド 'System.Data.Entity.ModelConfiguration.EntityTypeConfiguration.HasOptional(System.Linq.Expressions.Expression>)' でパラメーター 'TTargetEntity' として使用するには、参照型である必要があります。
さらに、"PostalAddressID" を文字列定数として MapKey() の呼び出しに渡すのが好きではありません。
誰かが私のやり方の誤りを強調してもらえますか? 私は過去3時間無駄に探していました!
編集: この部分を理解したら、Employee>ContactTelephoneNumbers の状況に個別に対処しようとします。