这是我将如何解决这个问题。
将外键属性添加到您的类。我说的是ParentAccountId
和AccountOwnerId
。为了使导航更容易一些,我还在 Account 中添加了一组子帐户,在 Contact 中添加了一组拥有的帐户。请注意,没有必要将“普通”属性设为虚拟。只有导航属性应该是虚拟的。
public class Account
{
public int AccountID {get; set;}
public string AccountName {get; set;}
public int? ParentAccountId { get; set; }
public int? AccountOwnerId { get; set; }
public virtual Account ParentAccount { get; set; }
public virtual ICollection<Account> ChildAccounts { get; set; }
public virtual Contact AccountOwner { get; set; }
public Account()
{
ChildAccounts = new List<Account>();
}
}
public class Contact
{
public int ContactID { get; set; }
public string ContactName { get; set; }
public virtual ICollection<Account> OwnedAccounts { get; set; }
public Contact()
{
OwnedAccounts = new List<Account>();
}
}
接下来,为 Account 类创建一个映射,以向 EF 解释如何设置关系。
public class AccountMapping : EntityTypeConfiguration<Account>
{
public AccountMapping()
{
HasOptional(x => x.ParentAccount).WithMany(x => x.ChildAccounts).HasForeignKey(x => x.ParentAccountId);
HasOptional(x => x.AccountOwner).WithMany(x => x.OwnedAccounts).HasForeignKey(x => x.AccountOwnerId);
}
}
最后,将映射添加到您的 DbContext 类。
public MyContext : DbContext
{
public DbSet<Account> Accounts { get; set; }
public DbSet<Contact> Contacts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new AccountMapping());
}
}
请注意,我假设 AccountOwner 和 ParentAccount 是可选的。如果需要,只需将外部属性的类型从更改为int?
并将映射中的 更改为。int
HasOptional
HasRequired