3

リンクされたオブジェクトは他のクラスで参照される必要があるため、EFコードが最初に多対多の関係で自動的に作成するリンクされたクラスを別のオブジェクトとして公開しようとしていますが、データベース。

私は次の3つのオブジェクトを持っています:

 public class Role : Entity
{
    public virtual ICollection<User> Users { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Permission> Permissions { get; set; }
}

public class User: Entity
{
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }

    public virtual ICollection<Role> Roles { get; set; }
 }

 public class UserRole : Entity
{
    public User User { get; set; }
    public Role Role { get; set; }
}

これにより、次のテーブルが作成されます。

ここに画像の説明を入力してください

これで、問題はテーブルを作成していることがわかりますが、RoleUsersテーブルを使用するべきではなく、使用する必要がありUserRolesます。リンクされたテーブルを強制的にUserRoles設定して、そのリンクされたオブジェクトをEFで公開し、他のオブジェクトで使用できるようにするにはどうすればよいですか?

また、クエリを作成するときに、オブジェクトをどのようにトラバースしますか?それでもUser.Roles.Any(y => y.Name == "blah")を使用できますか、それともUser.UserRoles.Any(y => y.Role.Name = = "何とか")?リンクされたオブジェクトを同時に公開しながら、透過的なリンクを維持することはできないと思いますか?

編集:ナビゲーションプロパティとしてUserRoleを参照するクラスの1つは、次のようになります。

 public class UserRoleEntity : Entity
{
    public UserRole UserRole { get; set; }
    public Guid EntityId { get; set; }
    public EntityType EntityType { get; set; }
}

UserオブジェクトとRoleオブジェクトをこのクラスに個別に格納したくないのは、それらが緊密に結合されておらず、データが孤立している可能性があるためです。

4

1 に答える 1

6

UserRoleコード内にエンティティを明示的に作成する必要はありません。RolesinUsersUsersinのナビゲーションプロパティがあるためRoles、EFはそれらの間に関係を自動的に作成します。

編集:リンクテーブルを作成し、それを別のクラスのプロパティとして使用する場合は、次のように行うことができます。

public class User 
{
    public int UserID { set; get; }
    public string FirstName { get; set; }     
    public string LastName { get; set; }
    public virtual ICollection<UserRole> UserRoles { get; set; }      
}
public class Role 
{      
    public int RoleID { set;get;}
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<UserRole> UserRoles { get; set; }
}
public class UserRole 
{
    public int UserRoleID { set; get; }
    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
}
public class AnotherEntity
{
    public int ID { set; get; }
    public int UserRoleID { set; get; }     
}

このようにテーブルを作成します

ここに画像の説明を入力してください

そして、あなたは正しいです、あなたはこのようにそれにアクセスしなければなりません

 StringBuilder stRoleNames = new StringBuilder();
 var user1 = dbContext.Users.Where(x => x.UserID == 34).SingleOrDefault();
 var userRoles = user1.UserRoles;
 foreach (var userRole in userRoles)
 {
     stRoleNames.Append(userRole.Role.Name);
 } 
于 2012-05-17T16:04:22.223 に答える