EF Code First:实体类型ApplicationUser不是当前上下文的模型的一部分

时间:2016-12-25 19:44:04

标签: c# asp.net-mvc entity-framework

我不知道为什么,但是当我尝试登录我的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]属性,只是为了检查是否在数据库中创建了实际用户。事实证明,根本没有创建用户!有什么想法吗?

3 个答案:

答案 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,现在一切似乎都有效了! :/