我有一个名为UsersInRoles的表,其中包含2个X外键作为复合键,它可以兼作此2列表的主键。只是为了解决多对多问题。因此,在实体框架6中,我有dal类。
let translateW (tx, ty) =
m.Translate(tx, ty)
所以我需要进入复合表中的字段。我想知道是否有人可以提供有关如何在dbcontext中的OnModelCreating中解决此问题的帮助。这样我就可以用hasKeys
做点什么了答案 0 :(得分:0)
如果您只需要更改Id的名称或表名,则可以使用此配置执行此操作:
modelBuilder.Entity<User>()
.HasMany(u => u.Roles)
.WithMany(r => r.Users)
.Map(cs =>
{
cs.MapLeftKey("UserRefId");
cs.MapRightKey("RoleRefId");
cs.ToTable("UsersInRoles");
});
现在,如果您需要明确访问junction table,或者需要添加新列,很遗憾,您需要将其映射为模型的一部分。
public partial class User
{
public User()
{
this.Roles = new HashSet<Role>();
}
public int UserId { get; set; }
//...
public virtual ICollection<UsersInRoles> Roles { get; set; }
}
public partial class Role
{
public Role()
{
this.Users = new HashSet<User>();
}
public int RoleId { get; set; }
public virtual ICollection<UsersInRoles> Users { get; set; }
}
public class UsersInRoles
{
[Key, Column(Order = 0),ForeignKey("User")]
public int UserId { get; set; }
[Key, Column(Order = 1),ForeignKey("Role")]
public int RoleId { get; set; }
public virtual User User { get; set; }
public virtual Role Role { get; set; }
//add new properties here
}
如果您更喜欢使用Fluent Api,请删除数据注释,并在您的上下文中使用OnModelCreating
方法添加这些配置:
modelBuilder.Entity<UsersInRoles>()
.HasKey(ur=> new { ur.UserId, ur.RoleId});
modelBuilder.Entity<UsersInRoles>()
.HasRequired(ur=> ur.User)
.WithMany(u => u.Roles)
.HasForeignKey(ur=> ur.UserId);
modelBuilder.Entity<UsersInRoles>()
.HasRequired(ur=> ur.Role)
.WithMany(u => u.Users)
.HasForeignKey(ur=> ur.RoleId);