【问题标题】:Entity Framework code-first change composite PK in Identity UserRoles tables实体框架代码优先更改身份用户角色表中的复合 PK
【发布时间】:2015-08-25 13:56:13
【问题描述】:

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

我通过添加另外两个实体关系来定制它:

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

如何在不手动触摸数据库的情况下先使用实体​​代码编写PK:UserId and RoleId and MyEntityId

【问题讨论】:

    标签: entity-framework asp.net-mvc-5 code-first entity-framework-6.1


    【解决方案1】:

    UserId and RoleIdIdentityDbContext 中的fluent API 配置为PK。你需要覆盖IdentityDbContext的模型生成器来添加你自己的PK。因此覆盖 DbContextOnModelCreating 方法。

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

    【讨论】:

      猜你喜欢
      • 2017-08-25
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2017-07-05
      相关资源
      最近更新 更多