使用Code First模拟3个表之间的多对多关系

我有以下3个实体:

  • 用户
  • 帐户
  • 角色

这种关系就像

  • 一个用户可以拥有多个帐户
  • 一个帐户可以属于许多用户
  • 每个用户都在帐户中有一个角色
  • 有一些预定义的角色(在枚举角色中定义)

我到目前为止:

public class User { public int Id { get; set; } public ICollection Accounts { get; set; } } public class Account { public int Id { get; set; } public ICollection Users { get; set; } } public class Role { public int Id { get; set; } public string RoleName { get; set; } public virtual ICollection Users { get; set; } public virtual ICollection Accounts { get; set; } } 

每次用户注册时,他们也会创建一个帐户,所以我想到了这个:

 public async Task AddAccountAsync(User user, string accountName) { Account account = new Account(user, accountName); Role role = new Role(Roles.Owner); Accounts.Add(account); user.Accounts.Add(account); Entry(user).State = EntityState.Modified; await SaveChangesAsync(); } 

但我不确定如何将角色与用户绑定到帐户,因此我可以获得用户在帐户中的角色。

例如:

考虑3个用户和3个帐户:

  • Account1 =(User1,Owner),(User2,TeamMember)
  • Account2 =(User2,所有者)
  • Account3 =(User3,Owner),(User1,ReadOnlyMember)

按照@ IvanStoev的回答,我得到了这个:

 public async Task AddAccountAsync(User user, string accountName) { Role role = new Role(Roles.Owner); Account account = new Account(model.AccountCurrency, model.AccountName, model.Description); UserAccount uc = new UserAccount { User = user, Account = account, Role = role }; account.UserAccounts.Add(uc); Accounts.Add(account); user.UserAccounts.Add(uc); Entry(user).State = EntityState.Modified; await SaveChangesAsync(); } 

我应该保存UserAccount对象(作为DbContext )吗?

  • 一个用户可以拥有多个帐户
  • 一个帐户可以属于许多用户
  • 每个用户都在帐户中有一个角色

当您需要将其他信息(在本例中为Role )与User - Account链接相关联时,自动链接表不适用于此类方案。

因此,您需要使用与显式链接实体的两个one-to-many关联,而不是自动many-to-many关联,如下所示:

模型:

 public class User { public int Id { get; set; } public ICollection UserAccounts { get; set; } } public class Account { public int Id { get; set; } public ICollection UserAccounts { get; set; } } public class UserAccount { public int UserId { get; set; } public int AccountId { get; set; } public int RoleId { get; set; } public User User { get; set; } public Account Account { get; set; } public Role Role { get; set; } } public class Role { public int Id { get; set; } public string RoleName { get; set; } public ICollection UserAccounts { get; set; } } 

组态:

 modelBuilder.Entity() .HasKey(e => new { e.UserId, e.AccountId }); modelBuilder.Entity() .HasRequired(e => e.User) .WithMany(e => e.UserAccounts) .HasForeignKey(e => e.UserId); modelBuilder.Entity() .HasRequired(e => e.Account) .WithMany(e => e.UserAccounts) .HasForeignKey(e => e.AccountId); modelBuilder.Entity() .HasRequired(e => e.Role) .WithMany(e => e.UserAccounts) .HasForeignKey(e => e.RoleId); 

您可以通过多种方式创建新的UserAccount

一种方法是将其添加到其中一个子UserAccounts集合中。 在您的示例中, account.UserAccounts.Add(uc); 然后是context.Accounts.Add(account)会自动将其添加到context.UserAccountsuser.UserAccountsrole.UserAccounts

另一种方法是使用context.UserAccounts.Add(uc); 在这种情况下,它将自动添加到useraccountroleUserAccounts集合中。