次のモデルが定義されています。
public class Account {
public int Id {get; set;}
... // other account properties
public ICollection<AccountAddress> Addresses {get; set;}
}
public class Address {
public int Id {get; set;}
public string Street1 {get; set;}
public string Street2 {get; set;}
... // other standard address properties
}
public class AccountAddress : Address {
public int AccountId {get; set;}
public DateTime? BeginDate {get; set;}
public string Notes {get; set;}
... // other account address specific properties
}
public class Site {
public int Id {get; set;}
public Address SiteAddress {get; set;}
}
アイデアは、任意のAddressを任意のAccountおよび任意のSiteに関連付けることができるということです。ただし、アドレスがアカウントに関連付けられている場合は常に、そのアドレスに関して保存する必要がある追加情報が存在する場合があります。
AccountAddress は Address から継承するため、TPT (Table Per Type) 継承を使用して、Address プロパティを Address テーブルにマップし、拡張プロパティを拡張アドレス プロパティのテーブルにマップしたいと考えました。
私はこれを試しました:
public class AccountConfiguration : EntityTypeConfiguration<Account>
{
public AccountConfiguration()
{
ToTable("Accounts");
HasKey(a => a.Id);
HasMany(a => a.Addresses).WithMany().Map(x =>
{
x.MapLeftKey("accountId");
x.MapRightKey("addressId");
x.ToTable("accountaddresses");
}
}
}
public class AddressConfiguration : EntityTypeConfiguration<Address>
{
public AddressConfiguration()
{
ToTable("addresses");
HasKey(a => a.Id);
... // other property mappings
}
}
public class AccountAddressConfiguration : EntityTypeConfiguration<AccountAddress>
{
public AccountAddressConfiguration()
{
ToTable("addressextended");
... //other property mappings
}
}
ここでの問題は、accountId を addressextended テーブルにマップするために何も定義されていないことです。したがって、ID が 40 のアドレスが 2 つの異なるアカウントに関連付けられている場合、次のクエリを実行します。
var _account = _context.Accounts
.Include(a => a.Addresses)
.SingleOrDefault(a => a.Id = 1234);
間違ったアカウントの拡張プロパティを提供することがあります。
これを機能させるにはどうすればよいですか?
編集: 受け入れられた回答は私の質問に具体的に答えませんでしたが(つまり、1つのエンティティがTPT継承マッピングで定義されている2つのエンティティ間の多対多の関係をどのように定義できますか)、許容できる回避策を考え出すのに役立ちました.
エンティティの継承を削除し、単純にアドレスを AccountAddress エンティティのプロパティとして追加しました。次に、AccountAddress (addressextended テーブル) に独自のプライマリ ID を指定しました。accountaddresses テーブルを、アカウント ID と accountaddress ID (addressextended テーブルの新しい ID) を含む結合テーブルに変更しました。
また、Address の AccountAddress にナビゲーション プロパティを追加し、それに対応するマッピングを追加する必要がありました。