[英]Entity Framework code-first change composite PK in Identity UserRoles tables
默認情況下, UserRoles
通過UserId and RoleId
映射了兩個表User
和Role
, UserId 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
。
如何在不手動觸摸數據庫的情況下首先使用實體代碼編寫PK
: UserId 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.