0

私は次のクラスを持っています:

public class Account
{
   public int Id {get; set;}
   public ICollection<AccountAddress> Addresses {get; set;}
}

public class Address 
{
   public int Id {get; set;}
   public string Street1 {get; set;}
   ... //Other address properties
}

public class AccountAddress : Address
{
   public int AccountId {get; set;}
   public DateTime BeginDate {get; set;}
   public DateTime PurgeDate {get; set;}
   public bool IsPrimary {get; set;}
}

私の流暢なAPI構成には、次のものがあります。

public AccountConfiguration()
{
    ToTable("accounts");
    HasKey(m => m.Id);
    Property(m => m.Id).HasColumnName("accountid");
    ...
    //This is wrong because it does not allow many to many
    HasMany(m => m.Addresses).WithRequired().HasForeignKey(m => m.AccountId);
}

public AddressConfiguration()
{
   ToTable("addresses");
   HasKey(a => a.Id);
   Property(a => a.Id).HasColumnName("addressid");
   ...
}

public AccountAddressConfiguration()
{
   ToTable("acctaddrs");
   HasKey(m => new {m.Id, m.AccountId});
   ...
}

AccountConfiguration の関係を編集して多対多の関係にしようとしていますが、それを定義する方法を理解するのに苦労しています。

この背後にある考え方は、アカウントは複数のアドレスを持つことができ、一部のアカウントは同じアドレスに関連付けることができるということです。

ご協力いただきありがとうございます。

編集 だから、ここに私が達成する必要があるものがあります。Id フィールドを持ち、一般的な住所情報をすべて格納するテーブル (Addresses) があります。Addresses テーブル内のアドレスを指す AddressId フィールドを持つテーブルは他にも多数あります。1 つのアドレスが、さまざまな関係で再利用される場合があります。

現在、アカウントには多くの住所がありますが、住所に関する追加データもあります。私が達成したいのは、住所データを Addresses テーブルに格納し、追加のデータを別のテーブルに格納することです。繰り返しますが、アカウントは住所を共有できますが、追加の住所データは共有できません。

4

1 に答える 1

0

これを多対多の関連付け (透過的なジャンクション テーブルを使用) としてモデル化することはできません。これは、ジャンクション テーブルにAccountAddressは主キーの値以上のものが含まれているためです。

真のジャンクション テーブルには以下AccountAddressも含まれている必要がありますAddressId

public class AccountAddress : Address
{
   [ForeignKey("Account"]] // Or fluent mapping
   public int AccountId {get; set;}
   public virtual Account Account {get; set;}

   [ForeignKey("Address"]] // Or fluent mapping
   public int AddressId {get; set;}
   public virtual Address Address {get; set;}

   public DateTime BeginDate {get; set;}
   public DateTime PurgeDate {get; set;}
   public bool IsPrimary {get; set;}
}

また、アカウントとアドレス クラスの両方にICollection<AccountAddress>.

これを としてマッピングしAddress 1 - n AccountAddress n - 1 Accountます。

たとえば、アカウントのアドレスを取得するには、次のようにします。

Accounts.Select(a => a.AccountAddresses
                     // .Where(a => a.IsPrimary // for instance
                      .Select(aa => aa.Address))
于 2013-02-04T21:57:12.107 に答える