我有以下三个实体:
用户
账户
角色
我们的关系就像
一个用户可以有多个帐户
一个帐户可以属于多个用户
每个用户在帐户中都有一个角色
有几个预定义的角色(在枚举角色中定义)
我做到了:

public class User
{
    public int Id { get; set; }
    public ICollection<Account> Accounts { get; set; }
}

public class Account
{
    public int Id { get; set; }
    public ICollection<User> Users { get; set; }
}

public class Role
{
    public int Id { get; set; }
    public string RoleName { get; set; }
    public virtual ICollection<User> Users { get; set; }
    public virtual ICollection<Account> 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,所有者),(user2,团队成员)
account2=(用户2,所有者)
account3=(user3,所有者),(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<UserAccount>)?

最佳答案

一个用户可以有多个帐户
一个帐户可以属于多个用户
每个用户在帐户中都有一个角色
当您需要将附加信息(Role在本例中)与User - Account链接关联时,自动链接表不适用于这种情况。
因此,与自动关联不同,您需要对显式链接实体使用两个关联,如下所示:
模型

public class User
{
    public int Id { get; set; }
    public ICollection<UserAccount> UserAccounts { get; set; }
}

public class Account
{
    public int Id { get; set; }
    public ICollection<UserAccount> 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<UserAccount> UserAccounts { get; set; }
}

配置:
modelBuilder.Entity<UserAccount>()
    .HasKey(e => new { e.UserId, e.AccountId });

modelBuilder.Entity<UserAccount>()
    .HasRequired(e => e.User)
    .WithMany(e => e.UserAccounts)
    .HasForeignKey(e => e.UserId);

modelBuilder.Entity<UserAccount>()
    .HasRequired(e => e.Account)
    .WithMany(e => e.UserAccounts)
    .HasForeignKey(e => e.AccountId);

modelBuilder.Entity<UserAccount>()
    .HasRequired(e => e.Role)
    .WithMany(e => e.UserAccounts)
    .HasForeignKey(e => e.RoleId);

您可以通过多种方式创建一个新的many-to-many
一种方法是将其添加到子集合之一。在您的示例中,one-to-many后跟UserAccount将自动将其添加到UserAccountsaccount.UserAccounts.Add(uc);context.Accounts.Add(account)
另一种方法是使用context.UserAccounts在这种情况下,它将自动添加到user.UserAccountsrole.UserAccountscontext.UserAccounts.Add(uc);user集合中。

08-06 20:57