我有以下课程:
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字段,并存储所有典型的地址信息。还有许多其他表具有AddressId字段,该字段指向Addresses表中的地址。许多不同的关系可以重复使用单个地址。
现在,一个帐户有许多地址,但也有关于地址的其他数据。我想要完成的是将地址数据存储在地址表中,并将附加数据存储在单独的表中。帐户可以再次共享地址,但不能共享其他地址数据。
答案 0 :(得分: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))