gpt4 book ai didi

c# - 使用 Code First 对 3 个表之间的多对多关系建模

转载 作者:太空狗 更新时间:2023-10-29 22:57:27 27 4
gpt4 key购买 nike

我有以下 3 个实体:

  • 用户
  • 帐号
  • 角色

关系是这样的

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

我做到了这一点:

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();
}

但我不确定如何将角色与用户绑定(bind)到帐户,这样我才能获得用户在帐户中的角色。

例如:

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

  • 帐户 1 =(用户 1,所有者),(用户 2,团队成员)
  • 帐户 2 =(用户 2,所有者)
  • 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<UserAccount> )吗?

最佳答案

  • One user can have many accounts
  • One account can belong to many users
  • Each user has a role in an account

当您需要将附加信息(在本例中为 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);

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

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

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

关于c# - 使用 Code First 对 3 个表之间的多对多关系建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38553853/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com