我定义了以下模型:
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;}
}
这个想法是任何地址都可以绑定到任何帐户以及任何站点。但是,只要地址与帐户相关联,就可能需要存储有关该地址的其他信息。
由于 AccountAddress 继承自 Address,我想使用 TPT(按类型表)继承将 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 的地址与两个不同的帐户相关联,请执行以下查询:
var _account = _context.Accounts
.Include(a => a.Addresses)
.SingleOrDefault(a => a.Id = 1234);
有时会为错误的帐户提供扩展属性。
我需要做什么才能使它正常工作?
编辑: 虽然接受的答案没有具体回答我的问题(即如何定义两个实体之间的多对多关系,其中一个实体是用 TPT 继承映射定义的),但它确实为提出可接受的解决方法提供了一些帮助.
我确实放弃了实体继承,只是将地址添加为我的 AccountAddress 实体的属性。然后我给了 AccountAddress(地址扩展表)它自己的主 ID。我将 accountaddresses 表更改为包含 account id 和 accountaddress id(addressextended 表的新 id)的连接表。
我还必须在 AccountAddress 中添加一个导航属性以获取 Address 和一个映射来配合它。