繁体   English   中英

实体框架中有多少关系正在发挥作用

[英]How many to many relationship in Entity Framework is working

我正在使用C#和Entity框架来构建授权应用程序。 我有用户,角色,权限,索赔表。 由于用户和角色具有多对多关系,因此我创建了use-Role表。 我有映射关系的问题。

这是我的用户类:

 public class User
     {

    public int UserId { get; set; }

    public string UserName { get; set; }
}

这是我的角色类:

public class Role
{
    public int RoleId { get; set; }

    public string RoleName { get; set; }
}

我不确定在User-Role类中我应该具备什么才能使我在进行更新时特别正确地使用多对多关系。
这是我的用户角色类:

 public class UserRole
    {

    public UserRole()
    {
        Roles = new Collection<Role>();
        Users = new Collection<User>();
    }

    public int Id { get; set; }

    public int UserId { get; set; }

    public string UserName { get; set; }

    public int RoleId { get; set; }

    public string RoleName { get; set; }

}

以及映射应该如何?

首先,为您提供解决方案,只要知道您正在重新发明轮子。 我说过,因为ASP.Net Identity只是做你想做的事情。

无论如何一些澄清:

  • UserRoleUserRole之间的关联实体
  • UserRole需要Role
  • UserRole需要User

UserRole表示一个User和一个Role 您可以将此实例作为mutch,因为User具有许多Role 这就是为什么用流利的API翻译它,你必须删除之前RolesUsers ,你投入的集合UserRole创造,而不是UserRoles作为一个集合ICollection<UserRole>到用户和角色。

你的课必须遵循这个:

用户类:

public class User
{
    public int Id { get; set; }

    public string Name { get; set; }

    public ICollection<UserRole> UserRoles { get; set; }

    public User()
    {
        this.UserRoles = new Collection<UserRole>();
    }
}

角色类:

public class Role
{
    public int Id { get; set; }

    public string Name { get; set; }

    public ICollection<UserRole> UserRoles { get; set; }

    public Role()
    {
        this.UserRoles = new Collection<UserRole>();
    }
}

UserRole类:

public class UserRole
{
    public int Id { get; set; }

    public int UserId { get; set; }

    public User User { get; set; }

    public int RoleId { get; set; }

    public Role Role { get; set; }
}

无需配置,EF将使用默认约定并创建所需的所有表。

通常当您的连接实体UserRole没有数据属性时,我的意思是外键,然后您可以将其删除,只需让UserRole如下:

用户类:

public class User
{
    public int Id { get; set; }

    public string Name { get; set; }

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

    public User()
    {
        this.Roles = new Collection<Role>();
    }
}

角色类:

public class Role
{
    public int Id { get; set; }

    public string Name { get; set; }

    public ICollection<User> Users { get; set; }

    public Role()
    {
        this.Users = new Collection<User>();
    }
}

同样不需要配置,EF将使用默认约定为您创建表和连接表。

要了解有关EF的很多内容,我推荐这个网站Entity Framework Tutorials ,如果你能阅读以下两本书:

  • 编程实体框架:DbContext

  • 编程实体框架:代码优先

如果您只是将集合导航属性添加到UserRole实体,则EF将按惯例创建多对多关系。 在这种情况下,EF会为您处理联结表( UserRoles ),因此,如果您不需要它,则无需映射它。 总之,您的模型可能是这样的:

public class User
{
    public int Id { get; set; }

    public string Name { get; set; }

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

public class Role
{
    public int Id { get; set; }

    public string Name { get; set; }

   public virtual ICollection<User> Users { get; set; }
}

例如,如果需要更改联结表的名称或PK的名称,可以在上下文类中重写OnModelCreating方法并添加此Fluent Api配置:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Entity<User>()
                .HasMany(s => s.Roles)
                .WithMany(c => c.Users)
                .Map(cs =>
                        {
                            cs.MapLeftKey("UserRefId");
                            cs.MapRightKey("RoleRefId");
                            cs.ToTable("UserRoles");
                        });

} 

如果您使用的是映射类,请在UserMap类的构造函数中添加以下配置:

public UserMap()
{

    HasMany(s => s.Roles)
   .WithMany(c => c.Users)
   .Map(cs =>
              {
                 cs.MapLeftKey("UserRefId");
                 cs.MapRightKey("RoleRefId");
                 cs.ToTable("UserRoles");
              });
}

如果您不需要用户和角色之间的自定义连接表,请同意@octaviocci。

但是,您似乎在UserRoles表中有一些自定义属性,如“String Role”,因此您可能希望该连接表中包含一些自定义字段。 如果是这种情况,请在UserRoles的映射中尝试此操作

this.HasRequired(t => t.Roles)。WithMany()。HasForeignKey(fk => fk.RoleId); this.HasRequired(t => t.Users)。WithMany()。HasForeignKey(fk => fk.UserId);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM