我正在使用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; }
}
以及映射应该如何?
答案 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;
}
是UserRole
和User
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)
如果您只是将集合导航属性添加到User
和Role
实体,则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);