我不知道为什么,但是当我尝试登录我的EF Code First MVC应用程序时出现错误。
我的家庭控制器具有[Authorize]
属性,因此我被直接重定向到登录页面,但是一旦我登录,我就会得到黄色死亡屏幕和错误:
实体类型ApplicationUser不是当前上下文模型的一部分。
CODE
这是我的上下文代码:
public class PdContext : IdentityDbContext<ApplicationUser>
{
public PdContext() : base("PdContext", throwIfV1Schema: false)
{
Configuration.LazyLoadingEnabled = true;
}
public static PdContext Create()
{
return new PdContext();
}
public DbSet<Business> Businesses { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Brand> Brands { get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<Address> Addresses { get; set; }
public DbSet<Invoice> Invoices { get; set; }
public DbSet<Payment> Payments { get; set; }
public DbSet<Order> Orders { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("PD");
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<IdentityRole>().HasKey(r => r.Id).ToTable("AspNetRoles");
modelBuilder.Entity<IdentityUserLogin>().HasKey(l => new { l.UserId, l.LoginProvider, l.ProviderKey }).ToTable("AspNetUserLogins");
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId }).ToTable("AspNetUserRoles");
modelBuilder.Entity<IdentityUserClaim>().ToTable("AspNetUserClaims");
modelBuilder.Entity<ApplicationUser>().ToTable("User");
}
}
以下是我的Seed方法中的代码,它负责创建我的用户和角色。
protected override void Seed(Context.PdContext context)
{
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
if (!roleManager.RoleExists("Admin"))
{
roleManager.Create(new IdentityRole("Admin"));
}
var adminUser = new ApplicationUser { UserName = "myemail@gmail.com", Email = "myemail@gmail.com" };
if (userManager.FindByName("myemail@gmail.com") != null) return;
var adminResult = userManager.Create(adminUser, "strongPassword");
if (adminResult.Succeeded)
{
userManager.AddToRole(adminUser.Id, "Admin");
}
// other non user related seeding happening here
}
我的连接字符串如下:
<add name="PdContext" providerName="System.Data.SqlClient" connectionString="Data Source=My-PC;Initial Catalog=Phoneden;Integrated Security=False;User Id=sa;Password=strongPass;MultipleActiveResultSets=True" />
我已经检查了,我只有一个连接字符串(我对错误的研究表明可能有两个连接字符串,在我的情况下没有。)
更新
我已禁用[Authorize]
属性,只是为了检查是否在数据库中创建了实际用户。事实证明,根本没有创建用户!有什么想法吗?
答案 0 :(得分:0)
这可能是一种解决方案,就像将连接字符串中的Integrated Security属性更改为True
一样简单。这表明要在提供的数据库中找到并使用Identity表。
因此,您的连接字符串将是:
<add name="PdContext" providerName="System.Data.SqlClient" connectionString="Data Source=My-PC;Initial Catalog=Phoneden;Integrated Security=True;User Id=sa;Password=strongPass;MultipleActiveResultSets=True" />
答案 1 :(得分:0)
您的应用程序中可能有2个不同的上下文,这在我们从标准ASP.NET MVC模板开始时是正常的。我通常做的是删除标准上下文并调整我正在创建的上下文(AppContext),如下面的代码所示:
public class AppContext : IdentityDbContext<ApplicationUser>
{
public AppContext() : base("PdContext")
{
}
}
catch是IdentityDbContext<ApplicationUser>
的继承,这使得成员资格在您的自定义上下文中有效。
答案 2 :(得分:0)
我不知道为什么会这样,但我删除了我的Migrations文件夹,并清理了我的解决方案,然后重新启用了迁移并添加了InitialCreate
迁移。然后做了Update-Database
,现在一切似乎都有效了! :/