1

コントローラーでテーブルを結合して結果を取得する方法がわかりません。'Groups' 'Users' 'GroupUser' (ブリッジ テーブル) の 3 つのテーブルがあります。

public class Group
    {
        [Key]
        public int GroupID { get; set; }
        public string Group_Name { get; set; }
        public ICollection<User> Users { get; set; }
    }

public class User
    {
        [Key]
        public int UserID { get; set; }
        public string User_Name { get; set; }

        public ICollection<Group> Groups { get; set; }
    }

この EFContext クラスもあります

base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<Group>()
                .HasMany(g => g.Users)
                .WithMany(u => u.Groups)
                .Map(m =>
                {
                    m.MapLeftKey("UserID");
                    m.MapRightKey("GroupID");
                    m.ToTable("GroupUSer");
                });

GroupUser クラス (GroupUser ブリッジ テーブルを表すため) も作成する必要がありますか?

次に、3 つのテーブルを結合してグループとユーザーのリストを取得するときに、どのように結果を取得しますか?

GroupViewModel model = new GroupViewModel
            {
                Groups = .... // this should be a linq statement that get results 
                that contains all groups and users
            };

等しいSQL文は次のようになります

select *
from Group g 
join GroupUser gu on g.GroupID=gu.GroupID
join User u on u.UserID=gu.UserID
4

1 に答える 1

1

いいえ、中級クラスは必要ありません。

ORM (Object-Relational Mapper、Entity Framework の一種) の主なポイントは、データベースを抽象化し、純粋なオブジェクト指向の方法で作業できるようにすることです。中間テーブルは間違いなくデータベース用語であり、ここでは必要ありません。

私が考えることができる唯一の理由は、関連付けに「ペイロード」(追加のメタデータ) が必要な場合です。例えば:

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

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

ここで、ユーザーとアカウントの関連付けで、関連付けが「アカウントを所有する」タイプ (管理者) であるかどうかを定義する場合は、次のようにすることができます。

public class User
{
     public int Id { get; set; }
     public int Email { get; set; }
     public virtual ICollection<AccountUserAssociation> Accounts { get; set; }
}

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

public class AccountUserAssociation
{
     public virtual User User { get; set; }
     public virtual Account Account { get; set; }
     public AssociationType AssociationType { get; set; }
}

public enum AssociationType { Regular, Administrator }
于 2013-07-30T17:16:38.917 に答える