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