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

时间:2016-02-10 18:07:14

标签: c# entity-framework

我正在使用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; }

}

以及映射应该如何?

3 个答案:

答案 0 :(得分:1)

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

无论如何澄清:

  • // Let's say you have a sheet of First, Last, email and you want to return the email of the // row the user has placed the cursor on. function getActiveEmail() { var activeSheet = SpreadsheetApp.getActiveSheet(); var activeRow = .getActiveCell().getRow(); var email = activeSheet.getRange(activeRow, 3).getValue(); return email; } UserRoleUser
  • 之间的关联实体
  • Role需要UserRole
  • Role需要UserRole

User表示一个UserRole和一个User之间的组合。您可以将此实例作为mutch,因为Role有许多User。这就是为什么在使用Fluent API进行翻译之前,您必须删除放入Role的{​​{1}}和Roles个集合,然后将Users创建为集合UserRole用户和角色。

您的课程必须遵循以下条件:

用户类:

UserRoles

角色等级:

ICollection<UserRole>

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

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

通常当您的加入实体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>(); } } 没有数据属性时,我的意思是外键,然后您可以将其删除,然后让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; } } UserRole如下:

用户类:

User

角色等级:

Role

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

要了解有关EF的很多内容,我建议您访问此网站Entity Framework Tutorials,如果您能阅读以下两本书:

  • 编程实体框架:DbContext

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

答案 1 :(得分:0)

如果您只是将集合导航属性添加到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");
              });
}

答案 2 :(得分:0)

如果您不需要用户和角色之间的自定义联接表,请与@octaviocci达成协议。

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

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