C# EF代码优先:实体类型ApplicationUser不是当前上下文模型的一部分
我不知道为什么,但当我尝试登录到我的EF代码第一个MVC应用程序时,我会遇到这个错误 我的家庭控制器具有C# EF代码优先:实体类型ApplicationUser不是当前上下文模型的一部分,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我不知道为什么,但当我尝试登录到我的EF代码第一个MVC应用程序时,我会遇到这个错误 我的家庭控制器具有[Authorize]属性,因此我被直接重定向到登录页面,但一旦我登录,我就会看到死亡的黄色屏幕和错误: 实体类型ApplicationUser不是当前上下文模型的一部分 代码 这里是我的上下文代码: public class PdContext : IdentityDbContext<ApplicationUser> { public PdContext() : base("
[Authorize]
属性,因此我被直接重定向到登录页面,但一旦我登录,我就会看到死亡的黄色屏幕和错误:
实体类型ApplicationUser不是当前上下文模型的一部分
代码
这里是我的上下文代码:
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");
}
}
公共类pContext:IdentityDbContext
{
public pContext():base(“pContext”,throwifvv1schema:false)
{
Configuration.LazyLoadingEnabled=true;
}
公共静态pContext创建()
{
返回新的pContext();
}
公共数据库集业务{get;set;}
公共数据库集类别{get;set;}
公共DbSet品牌{get;set;}
公共数据库集产品{get;set;}
公共数据库集地址{get;set;}
公共数据库集{get;set;}
公共数据库集{get;set;}
公共数据库集命令{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.hasdaultschema(“PD”);
modelBuilder.Conventions.Remove();
基于模型创建(modelBuilder);
modelBuilder.Entity().HasKey(r=>r.Id).ToTable(“AspNetRoles”);
modelBuilder.Entity().HasKey(l=>new{l.UserId,l.LoginProvider,l.ProviderKey}).ToTable(“AspNetUserLogins”);
modelBuilder.Entity().HasKey(r=>new{r.RoleId,r.UserId}).ToTable(“AspNetUserRoles”);
modelBuilder.Entity().ToTable(“AspNetUserClaims”);
modelBuilder.Entity().ToTable(“用户”);
}
}
下面是我的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
}
protected override void Seed(Context.PdContext上下文)
{
var角色管理器=新角色管理器(新角色存储(上下文));
var userManager=newusermanager(newuserstore(context));
如果(!roleManager.RoleExists(“Admin”))
{
roleManager.Create(新的IdentityRole(“管理员”));
}
var adminUser=新应用程序用户{UserName=”myemail@gmail.com“,电子邮件=”myemail@gmail.com" };
if(userManager.FindByName(“myemail@gmail.com“”!=null)返回;
var adminResult=userManager.Create(adminUser,“strong密码”);
if(adminResult.successed)
{
AddToRole(adminUser.Id,“Admin”);
}
//其他与用户无关的种子设定发生在此处
}
我的连接字符串如下所示:
<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]
属性,只是为了检查是否在数据库中创建了实际用户。事实证明,该用户根本没有被创建!有什么想法吗?这可能是一个简单的解决方案,只要将连接字符串中的集成安全属性更改为True
。这说明将在提供的数据库中找到并使用标识表
因此,您的连接字符串将是:
<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" />
这可能是一个简单的解决方案,只要将连接字符串中的集成安全属性更改为
True
。这说明将在提供的数据库中找到并使用标识表
因此,您的连接字符串将是:
<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" />
应用程序中可能有两种不同的上下文,这在我们开始使用标准ASP.NET MVC模板时是正常的。我通常做的是删除标准上下文并调整我正在创建的上下文(AppContext),如下代码所示:
public class AppContext : IdentityDbContext<ApplicationUser>
{
public AppContext() : base("PdContext")
{
}
}
公共类AppContext:IdentityDbContext
{
public AppContext():基(“pContext”)
{
}
}
问题在于继承了
IdentityDbContext
,这使得成员资格可以在您的自定义上下文中工作。您的应用程序中可能有两个不同的上下文,这在我们开始使用标准ASP.NET MVC模板时是正常的。我通常做的是删除标准上下文并调整我正在创建的上下文(AppContext),如下代码所示:
public class AppContext : IdentityDbContext<ApplicationUser>
{
public AppContext() : base("PdContext")
{
}
}
公共类AppContext:IdentityDbContext
{
public AppContext():基(“pContext”)
{
}
}
问题在于继承了
IdentityDbContext
,这使得成员资格可以在您的自定义上下文中工作。我不知道为什么会这样,但我删除了我的迁移文件夹,清理了我的解决方案,然后重新启用了迁移,并添加了初始创建
迁移。然后更新了数据库
,现在一切似乎都正常了!:/ 我不知道为什么会这样,但我删除了我的Migrations文件夹,清理了我的解决方案,然后重新启用了迁移,并添加了一个InitialCreate
迁移。然后更新了数据库
,现在一切似乎都正常了!:/ 那么,您是否只有一个数据库连接具有标识所需的表?是的。当我在SQLManagementStudio中检查时,所有成员表都在那里!我已经发布了一个解决你问题的潜在方案。试试看,让我知道它是否适合你。你能发布你是如何建立你的上下文的,这样我们就可以看一看吗?@Davidsonsosa我已经添加了上下文代码。那么,你是否只有一个数据库连接具有标识所需的表?是的。当我在SQLManagementStudio中检查时,所有成员表都在那里!我已经发布了一个解决你问题的潜在方案。试试看,让我知道它是否对你有用。你能发布你是如何构建你的上下文的,这样我们就可以看一看吗?@Davidsonsosa我已经添加了上下文代码。我只是尝试了你的建议,没有什么不同。我还是会犯同样的错误。我只是尝试了你的建议,结果没有什么不同。我仍然收到相同的错误。我检查了,我的是从IdentityDbContext
继承的,我在原始帖子中添加了代码。我检查了