【问题标题】:EF Code First, exposing a linked table/object from a many to many relationship?EF 代码首先,从多对多关系公开链接表/对象?
【发布时间】:2012-05-17 15:52:59
【问题描述】:

我试图将 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 对象单独存储在此类中,因为这样它们就不是紧密耦合的,并且数据可能是孤立的。

【问题讨论】:

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


    【解决方案1】:

    您无需在代码中显式创建UserRole 实体。由于Users 中的RolesRoles 中的Users 的导航属性,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);
     } 
    

    【讨论】:

    • 我在帖子中说过我需要暴露链接的对象,因为它需要在其他对象中引用。我不想只将用户和角色对象放在其他对象中,因为那样它们就会解耦。
    • @DOTang:你是说你想要链接表 UserRoles(导航类)作为另一个类的属性?您是否要将其用作用户和角色以外的属性?哪个表和它是什么关系?它创建 2 个表的原因是因为您在用户和角色中有 2 个导航属性相互指向。
    • 是的,这就是我要说的。我用其他班级更新了我的帖子。我明白为什么要创建 2 个表,一个是自动创建的,另一个是我手动创建的,它本质上跟踪相同的信息。那么我怎样才能使 EF 使用我的作为链接表并且它仍然是公开的(所以我可以在其他类中引用 UserRole 作为导航属性)?
    • 这很简单,我正在寻找一些方法来通过覆盖默认映射来克服这个问题......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2019-02-27
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多