我已经浏览了很多StackOverflow帖子和大量博客但我无法弄清楚我在这里缺少什么....
使用:
EF 6.1.3
AspNet.Identity.Core 2.2.1
AspNet.Identity.EntityFramework 2.2.1
ApplicationUser:
[Table("Users", Schema = "User")]
public class ApplicationUser : IdentityUser<Guid,ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
}
ApplicationUserClaim
[Table("UserClaims", Schema = "User")]
public class ApplicationUserClaim: IdentityUserClaim<Guid>
{
}
ApplicationUserLogin
[Table("UserLogins", Schema = "User")]
public class ApplicationUserLogin: IdentityUserLogin<Guid>
{
}
ApplicationUserRole
[Table("UserRoles", Schema = "User")]
public class ApplicationUserRole: IdentityUserRole<Guid>
{
}
ApplicationRole
[Table("Roles", Schema = "Application")]
public class ApplicationRole: IdentityRole<Guid, ApplicationUserRole>
{
}
ApplicationDbContext
public class ApplicationDbContext : IdentityDbContext<ApplicationUser,ApplicationRole, Guid, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
.
.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("Application");
base.OnModelCreating(modelBuilder);
SetupApplicationTables(modelBuilder);
Configuration.ProxyCreationEnabled = false;
Configuration.LazyLoadingEnabled = false;
}
.
.
private void SetupApplicationTables(DbModelBuilder modelBuilder)
{
// Application.Roles Table
//modelBuilder.Entity<IdentityRole>().ToTable("Roles", "Application");
//// User.UserLogins Table
modelBuilder.Entity<ApplicationUserLogin>().HasKey(ul => new {ul.LoginProvider, ul.ProviderKey, ul.UserId});
modelBuilder.Entity<ApplicationUserLogin>().ToTable("UserLogins", "User");
//// User.Users Table
//modelBuilder.Entity<IdentityUser>().ToTable("Users", "User");
//// User.UserRoles Table
modelBuilder.Entity<ApplicationUserRole>().HasKey(ur => new { ur.RoleId, ur.UserId});
modelBuilder.Entity<ApplicationUserRole>().ToTable("UserRoles", "User");
//// User.UserClaims Table
//modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims", "User");
}
当我尝试添加迁移时,我得到以下内容:
PeoplesParty.DataAccessLayer.DbContext.IdentityUserRole :: EntityType&#39; IdentityUserRole&#39;没有定义键。定义此EntityType的键。 PeoplesParty.DataAccessLayer.DbContext.IdentityUserLogin :: EntityType&#39; IdentityUserLogin&#39;没有定义键。定义此EntityType的键。 IdentityUserRoles:EntityType:EntitySet&#39; IdentityUserRoles&#39;基于类型&#39; IdentityUserRole&#39;没有定义键。 IdentityUserLogins:EntityType:EntitySet&#39; IdentityUserLogins&#39;基于类型&#39; IdentityUserLogin&#39;没有定义键。
为了使这项工作我做了一些改变,仍然没有运气:
// MODELS
[Table("Users", Schema = "User")]
public class ApplicationUser : IdentityUser<Guid,ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
public ApplicationUser()
: base()
{
}
}
[Table("Roles", Schema = "Application")]
public class ApplicationRole : IdentityRole<Guid, ApplicationUserRole>
{
public ApplicationRole()
{
Id = Guid.NewGuid();
}
public ApplicationRole(string name)
{
Name = name;
Id = Guid.NewGuid();
}
}
[Table("UserClaims", Schema = "User")]
public class ApplicationUserClaim: IdentityUserClaim<Guid>
{
public ApplicationUserClaim()
: base()
{
}
}
[Table("UserLogins", Schema = "User")]
public class ApplicationUserLogin: IdentityUserLogin<Guid>
{
public ApplicationUserLogin()
: base()
{
}
}
[Table("UserRoles", Schema = "User")]
public class ApplicationUserRole : IdentityUserRole<Guid>
{
public ApplicationUserRole()
: base()
{
}
}
// DB CONTEXT
public class ApplicationDbContext
: IdentityDbContext<ApplicationUser, ApplicationRole, Guid, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
static ApplicationDbContext()
{
Database.SetInitializer<ApplicationDbContext>(null);
}
public ApplicationDbContext()
: this("PeoplesPartyDB2")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Configuration.ProxyCreationEnabled = false;
Configuration.LazyLoadingEnabled = false;
modelBuilder.HasDefaultSchema("Application");
base.OnModelCreating(modelBuilder);
SetupCustomIdentityTables(modelBuilder);
}
private void SetupCustomIdentityTables(DbModelBuilder modelBuilder)
{
if (modelBuilder == null)
{
throw new ArgumentNullException(nameof(modelBuilder));
}
// Needed to ensure subclasses share the same table
var user = modelBuilder.Entity<ApplicationUser>().HasKey(au => au.Id).ToTable("Users", "User");
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}));
// CONSIDER: u.Email is Required if set on options?
user.Property(u => u.Email).HasMaxLength(256);
modelBuilder.Entity<ApplicationUserRole>().HasKey(ur => new {ur.UserId, ur.RoleId}).ToTable("UserRoles", "User");
modelBuilder.Entity<ApplicationUserLogin>()
.HasKey(ul => new {ul.LoginProvider, ul.ProviderKey, ul.UserId})
.ToTable("UserLogins", "User");
modelBuilder.Entity<ApplicationUserClaim>().HasKey(uc => uc.Id).ToTable("UserClaims", "User");
var role = modelBuilder.Entity<ApplicationRole>().HasKey(ar => ar.Id).ToTable("Roles", "Application");
role.HasMany(r => r.Users).WithRequired().HasForeignKey(ur => ur.RoleId);
role.Property(r => r.Name)
.IsRequired()
.HasMaxLength(256)
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("RoleNameIndex") {IsUnique = true}));
}
}