EF Code First,从多对多关系中公开链接表/对象?

时间:2012-05-17 15:53:00

标签: c# entity-framework ef-code-first many-to-many

我试图公开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; }
}

这将创建以下表格:

enter image description here

现在我可以看到问题是它正在创建一个RoleUsers表,当它不应该而且应该只使用我的UserRoles表。如何强制链接表为UserRoles,以便我可以在EF中显示该链接对象,以便在其他对象中使用它?

另外,在编写查询时,如何遍历对象?我是否仍然可以使用User.Roles.Any(y =&gt; y.Name ==“blah”),或者我现在必须通过去User.UserRoles.Any(y =&gt; y.Role。姓名==“等等”)?我想在同时暴露链接对象的同时不可能保持透明链接?

编辑:引用UserRole作为导航属性的类之一如下所示:

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

我不想在这个类中单独存储User和Role对象,因为它们没有紧密耦合,数据可能是孤立的。

1 个答案:

答案 0 :(得分:5)

您无需在代码中明确创建UserRole实体。由于Roles中的UsersUsers中的Roles具有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; } } 的导航属性,因此EF会自动在它们之间建立关系。

编辑:如果你想创建链接表并将其用作另一个类的属性,你可以这样做。

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

你会像这样创建你的表

enter image description here

你是对的,你必须像这样访问它

{{1}}