1

私はかなり長い間潜んでいるので、ここに最初の質問があります;)

私はEntityFramework5.0 Code Firstで遊んでいて、次のことをしたいと思っています。

私には2つのエンティティがあり、すべてのエンティティが次のようにアドレスエンティティと関係を持つようにします。

  • アドレス値を格納するAddressエンティティが1つありますが、値を持つエンティティとは関係がありません。
  • Addressエンティティと対応するエンティティ(PersonCompany、将来的には他のいくつか)を参照する別のエンティティAddressBookがあります

コードは次のとおりです。

public partial class Address : BaseEntity
{
    [Key]
    public int ID { get; set; }
    public string Street { get; set; }
    public string CityName { get; set; }
    public int? PostalCode { get; set; }

    public virtual ICollection<Person> Persons { get; set; }
    public virtual ICollection<Company> Companies{ get; set; }
}

public partial class Person : BaseEntity 
{
    [Key]
    public int ID { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }

}

public partial class Company: BaseEntity 
{
    [Key]
    public int ID { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
}

これにより、テーブルを使用してデータベーススキーマが作成されます。

  • 住所
  • AddressPerson(複合主キー付き)
    • Address_ID
    • Person_ID
  • AddressCompany
    • Address_ID
    • Company_ID
  • 人々
  • 企業

これが私がやりたいことです:

  • 住所
  • 住所録
    • Address_ID(PK)
    • Person_ID(FK)
    • Company_ID(FK)
  • 人々
  • 企業

私がやりたいのは、AddressBookのようなテーブルを用意することです。

public partial class AddressBook
{
    [Key]
    public int ID { get; set; }
    public virtual Address Address { get; set; }
    public virtual Person Person { get; set; }
    public virtual Company Company { get; set; }
}

PersonクラスとCompanyクラスでナビゲーションプロパティを定義する方法がわかりません。

基になるAddressBookICollection<Address> Addressesについて知らなくても、アドレスのコレクションだけで機能するようにしたいので、ナビゲーションプロパティが必要 です。

これを行うことは可能ですか、DbModelBuilderそれともプロパティの内部getterとプロパティのコードを記述して、 AddressBookからアドレスを取得する必要がsetterありますか?ICollection<Address> Addresses

ありがとう!

4

1 に答える 1

0

AddressesEntity FrameworkがコレクションPersonCompany真のナビゲーションプロパティ(熱心な読み込みや遅延読み込みなどをサポートする)として理解するような方法でマッピングを作成することはできません。このためには、確かにAddressBooksコレクションが必要です。Addresses次に、マップされていない、読み取り専用のヘルパープロパティを追加できます。

public partial class Person : BaseEntity 
{
    [Key]
    public int ID { get; set; }
    public virtual ICollection<AddressBook> AddressBookEntries { get; set; }

    public IEnumerable<Address> Addresses
    {
        get { return AddressBookEntries.Select(ab => ab.Address); }
    }
}

(と同じCompanyです。)

別の、そして私の意見では、より良いアプローチは、との共通基本クラスを作成しPerson、コレクションをその基本クラスCompanyに移動し、この基本クラスと:Addressesの間に単一の多対多関係と単一の結合テーブルを持つことです。Address

public abstract class EntityWithAddresses : BaseEntity
{
    [Key]
    public int ID { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
}

public partial class Person : EntityWithAddresses 
{
}

public partial class Company : EntityWithAddresses 
{
}

Address新しい基本クラスへのナビゲーションコレクションがあります。

public partial class Address : BaseEntity
{
    [Key]
    public int ID { get; set; }
    public string Street { get; set; }
    public string CityName { get; set; }
    public int? PostalCode { get; set; }

    public virtual ICollection<EntityWithAddresses> EntityWithAddresses { get; set; }
}
于 2013-03-24T15:37:59.973 に答える