2016-07-24 16 views
3

I持って、次の3つの事業体:モデル化と3つのテーブル間の多対多の関係コードまず

  • ユーザー
  • アカウント
  • 役割

との関係は次のようになります

  • 1人のユーザーが多数のアカウントを持つことができます
  • 1つのアカウントには、多くのユーザー
  • 各ユーザーは、アカウント内の役割を持っているに属することができ
  • 私はここまでだ

(列挙型ロールで定義された)いくつか、事前に定義された役割があります。

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

しかし、私はその役割をユーザーにアカウントに結び付けているかどうかはわかりません。そのため、ユーザーがアカウントに持つ役割を得ることができます。

  • Account1 =(ユーザー1、所有者)、(ユーザ2、TeamMember)
  • Account2 =(ユーザー2、所有者)
  • 3つのユーザーと3つのアカウントを考慮してください。例えば

    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>)?

+0

'User'は' Role'なしで 'Account'を持つことができますか?あなたが望むものの例を提供すれば、より詳細な情報を提供するべきです。 –

+0

@TaherRahgooyいいえ、ユーザーはアカウントで役割が必要です。私は例を追加します –

答えて

4
  • 一つのユーザーが多くのユーザー
  • 各ユーザーは、アカウント内の役割を持っているに属することができ、多くのアカウント
  • つのアカウントを持つことができ

自動リンクテーブルは動作しません。追加の情報(この場合は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); 

ので、代わりにあなたは、このように明示的なリンク実体を持つ2つのone-to-many関連付けを使用する必要が自動many-to-many協会の

新しいを作成することができますいくつかの点ではです。

1つの方法は、子のUserAccountsコレクションの1つに追加することです。あなたの例では、account.UserAccounts.Add(uc);に続いてcontext.Accounts.Add(account)が自動的にcontext.UserAccounts,user.UserAccountsおよびrole.UserAccountsに追加されます。

もう一つの方法は、それが自動的にuseraccountroleUserAccountsコレクションに追加される場合にはcontext.UserAccounts.Add(uc);を使用することです。

+0

これはかなり良いようです。新しいユーザー/アカウントを作成する方法の例を追加してください。私は推測しましたが、私は確信しています –

+0

'UserAccount'を子コレクションの1つに追加するだけで十分です(通常の' one-to-many'の場合のように)。あなたのサンプルでは、​​ 'account.UserAccounts.Add(uc);'で十分です。 –

+0

あなたの答えをありがとう、それは私が探していたものです –

関連する問題