在db表中处理组合键

时间:2015-10-29 14:21:53

标签: c# asp.net-mvc entity-framework

我有一个名为UsersInRoles的表,其中包含2个X外键作为复合键,它可以兼作此2列表的主键。只是为了解决多对多问题。因此,在实体框架6中,我有dal类。

let translateW (tx, ty) =
    m.Translate(tx, ty)

所以我需要进入复合表中的字段。我想知道是否有人可以提供有关如何在dbcontext中的OnModelCreating中解决此问题的帮助。这样我就可以用hasKeys

做点什么了

1 个答案:

答案 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);