Entity framework 实体框架代码首次更改Identity UserRoles表中的复合PK

Entity framework 实体框架代码首次更改Identity UserRoles表中的复合PK,entity-framework,asp.net-mvc-5,code-first,entity-framework-6.1,Entity Framework,Asp.net Mvc 5,Code First,Entity Framework 6.1,默认情况下,UserRoles通过UserId和RoleId映射了两个表User和Role,并在上述列上具有复合键 我通过再添加两个实体关系来定制: public class CustomUserRole : IdentityUserRole<int> { [Key] public int MyEntityId { get; set; } public virtual MyEntity MyEntity { get; set; } }

默认情况下,
UserRoles
通过
UserId和RoleId
映射了两个表
User
Role
,并在上述列上具有复合键

我通过再添加两个实体关系来定制:

public class CustomUserRole : IdentityUserRole<int>
{
        [Key]
        public int MyEntityId { get; set; }
        public virtual MyEntity MyEntity { get; set; }
}
更新数据库后,
UserRole
表中又有一列名为
MyEntityId
,但它被添加为
FK
。我希望有三个复合主键
UserId和RoleId以及MyEntityId


如何使用实体代码首先合成
PK
UserId、RoleId和MyEntityId
,而无需手动触摸数据库?

UserId和RoleId
由fluent API在
IdentityDbContext
中配置为PK。您需要覆盖
IdentityDbContext
的模型生成器来添加您自己的PK。因此,重写
DbContext的
OnModelCreating
方法

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    if (modelBuilder == null)
    {
        throw new ArgumentNullException("modelBuilder");
    }

    var user = modelBuilder.Entity<ApplicationUser>()
        .ToTable("AspNetUsers");
    user.HasMany(u => u.Roles).WithRequired().HasForeignKey(ur => ur.UserId);
    user.HasMany(u => u.Claims).WithRequired().HasForeignKey(uc => uc.UserId);
    user.HasMany(u => u.Logins).WithRequired().HasForeignKey(ul => ul.UserId);
    user.Property(u => u.UserName)
        .IsRequired()
        .HasMaxLength(256)
        .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("UserNameIndex") { IsUnique = true }));


    user.Property(u => u.Email).HasMaxLength(256);

    // We add our PK there other configurations are Identity's default.
    modelBuilder.Entity<CustomUserRole>()
        .HasKey(r => new { r.UserId, r.RoleId, r.MyEntityId })
        .ToTable("AspNetUserRoles");

    modelBuilder.Entity<IdentityUserLogin>()
        .HasKey(l => new { l.LoginProvider, l.ProviderKey, l.UserId })
        .ToTable("AspNetUserLogins");

    modelBuilder.Entity<IdentityUserClaim>()
        .ToTable("AspNetUserClaims");

    var role = modelBuilder.Entity<MyIdentityRole>()
        .ToTable("AspNetRoles");
    role.Property(r => r.Name)
        .IsRequired()
        .HasMaxLength(256)
        .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("RoleNameIndex") { IsUnique = true }));
    role.HasMany(r => r.Users).WithRequired().HasForeignKey(ur => ur.RoleId);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
if(modelBuilder==null)
{
抛出新的ArgumentNullException(“modelBuilder”);
}
var user=modelBuilder.Entity()
.ToTable(“AspNetUsers”);
user.HasMany(u=>u.Roles).WithRequired().HasForeignKey(ur=>ur.UserId);
user.HasMany(u=>u.Claims).WithRequired().HasForeignKey(uc=>uc.UserId);
user.HasMany(u=>u.Logins).WithRequired().HasForeignKey(ul=>ul.UserId);
user.Property(u=>u.UserName)
.IsRequired()
.HasMaxLength(256)
.HasColumnAnnotation(“索引”,新索引注释(新索引属性(“用户名索引”){IsUnique=true}));
user.Property(u=>u.Email).HasMaxLength(256);
//我们添加了PK,其他配置是Identity的默认配置。
modelBuilder.Entity()
.HasKey(r=>new{r.UserId,r.RoleId,r.MyEntityId})
.ToTable(“AspNetUserRoles”);
modelBuilder.Entity()
.HasKey(l=>new{l.LoginProvider,l.ProviderKey,l.UserId})
.ToTable(“AspNetUserLogins”);
modelBuilder.Entity()
.ToTable(“AspNetUserClaims”);
var role=modelBuilder.Entity()
.ToTable(“AspNetRoles”);
属性(r=>r.Name)
.IsRequired()
.HasMaxLength(256)
.HasColumnAnnotation(“索引”,新索引注释(新索引属性(“RoleNameIndex”){IsUnique=true});
role.HasMany(r=>r.Users).WithRequired().HasForeignKey(ur=>ur.RoleId);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    if (modelBuilder == null)
    {
        throw new ArgumentNullException("modelBuilder");
    }

    var user = modelBuilder.Entity<ApplicationUser>()
        .ToTable("AspNetUsers");
    user.HasMany(u => u.Roles).WithRequired().HasForeignKey(ur => ur.UserId);
    user.HasMany(u => u.Claims).WithRequired().HasForeignKey(uc => uc.UserId);
    user.HasMany(u => u.Logins).WithRequired().HasForeignKey(ul => ul.UserId);
    user.Property(u => u.UserName)
        .IsRequired()
        .HasMaxLength(256)
        .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("UserNameIndex") { IsUnique = true }));


    user.Property(u => u.Email).HasMaxLength(256);

    // We add our PK there other configurations are Identity's default.
    modelBuilder.Entity<CustomUserRole>()
        .HasKey(r => new { r.UserId, r.RoleId, r.MyEntityId })
        .ToTable("AspNetUserRoles");

    modelBuilder.Entity<IdentityUserLogin>()
        .HasKey(l => new { l.LoginProvider, l.ProviderKey, l.UserId })
        .ToTable("AspNetUserLogins");

    modelBuilder.Entity<IdentityUserClaim>()
        .ToTable("AspNetUserClaims");

    var role = modelBuilder.Entity<MyIdentityRole>()
        .ToTable("AspNetRoles");
    role.Property(r => r.Name)
        .IsRequired()
        .HasMaxLength(256)
        .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("RoleNameIndex") { IsUnique = true }));
    role.HasMany(r => r.Users).WithRequired().HasForeignKey(ur => ur.RoleId);
}