簡體   English   中英

Identity UserRoles表中的實體框架代碼優先更改復合PK

[英]Entity Framework code-first change composite PK in Identity UserRoles tables

默認情況下, UserRoles通過UserId and RoleId映射了兩個表UserRoleUserId and RoleId在上面的列上具有復合鍵。

我通過添加另外兩個實體關系來進行自定義:

public class CustomUserRole : IdentityUserRole<int>
{
        [Key]
        public int MyEntityId { get; set; }
        public virtual MyEntity MyEntity { get; set; }
}

我有以下遷移腳本:

public override void Up()
{
            CreateTable(
                "dbo.MyEntity",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Name = c.String(),
                    })
                .PrimaryKey(t => t.Id);           

            AddColumn("dbo.UserRoles", "MyEntityId", c => c.Int(nullable: false));
            CreateIndex("dbo.UserRoles", "MyEntityId");
            AddForeignKey("dbo.UserRoles", "MyEntityId", "dbo.MyEntity", "Id", cascadeDelete: true);
}

更新數據庫后, UserRole表在其中又增加了一個列,稱為MyEntityId但將其添加為FK 我期望有三個復合主鍵UserId and RoleId and MyEntityId

如何在不手動觸摸數據庫的情況下首先使用實體​​代碼編寫PKUserId and RoleId and MyEntityId

UserId and RoleId通過IdentityDbContext的流利API配置為PK。 您需要覆蓋IdentityDbContext的模型構建器以添加您自己的PK。 因此重寫OnModelCreating你的方法DbContext

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM