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 作为导航属性的类之一如下所示:

 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 回答