实体类型 ApplicationUser 不是当前上下文模型的一部分。在项目开始时使用了两个不同的数据库

Posted

技术标签:

【中文标题】实体类型 ApplicationUser 不是当前上下文模型的一部分。在项目开始时使用了两个不同的数据库【英文标题】:The entity type ApplicationUser is not part of the model for the current context. Used two different databases at beginning of project 【发布时间】:2017-05-10 00:42:47 【问题描述】:

我使用实体框架创建了一个 MVC 4 应用程序,用于向我在 Azure 数据库上托管的数据库读取和写入数据。 Azure 数据库应该保留应用程序数据和应用程序的登录数据。

但是,当我第一次创建应用程序时,我忘记了删除本地计算机的连接字符串。因此,我创建了一个在两个不同位置使用两个不同数据库的应用程序。一个数据库用于应用程序数据 (Azure),另一个数据库用于登录数据 (Local)。

由于我想将此应用程序发布到 Azure,我想将 Azure 数据库用于应用程序和登录信息,并完全排除我本地计算机的数据库。

我首先从应用程序的 web.config 文件中删除了本地数据库的连接字符串,从而开始了这个过程。

然后,我更改了 IdentityModels.cs 中的 ApplicationDBContext 类以反映以下更改...

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

    public ApplicationDbContext()
        : base("AbacusEntities", throwIfV1Schema: false)
    
    

    public static ApplicationDbContext Create()
    
        return new ApplicationDbContext();
    

进行这些更改后,我清理了解决方案,重新构建了它,然后在我的机器上运行它。尝试登录时(此时无论如何都不会成功),我收到此错误“实体类型 ApplicationUser 不是当前上下文模型的一部分。”在 AccountController.cs 文件中的以下代码上。标有“***”的行是调用错误的行。

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    
        if (!ModelState.IsValid)
        
            return View(model);
        

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        ***var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new  ReturnUrl = returnUrl, RememberMe = model.RememberMe );
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        
    

另外,在尝试注册新用户时,我在 AccountController.cs 文件中名为“Register”的方法中的以下代码行中遇到相同的错误,这是用户提交用户时的 POST 方法注册。

var result = await UserManager.CreateAsync(user, model.Password);

另外,请参阅下面 web.config 中的连接字符串。当然,所有敏感信息都已被删除。

add name="AbacusEntities" connectionString="metadata=res://*/Models.AbacusModel.csdl|res://*/Models.AbacusModel.ssdl|res://*/Models.AbacusModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=Azure server;initial catalog=database name;user id=Database User;password=Password;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" 

我浏览了许多帖子,但找不到任何有用的信息。我一直在考虑下一步是将我为用户帐户从本地数据库创建的表迁移到 Azure 数据库,但我并不完全相信这会奏效。

我宁愿在 Azure 数据库中生成这些表,并使用 Visual Studio 使用这些表进行身份验证。

最初使用两个不同的数据库登录时,登录过程运行良好,但现在我需要获取要在 Azure 中生成登录数据的表。

非常感谢您的帮助,如果您需要任何其他信息,请告诉我!

来自 cmets 的更新:

ApplicationUser 类在 IdentityModel.cs 文件中定义。下面是课程。

public class ApplicationUser : IdentityUser

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    

【问题讨论】:

ApplicationUser 定义在哪里? 【参考方案1】:

我已尝试按照以下步骤重现您的问题:

1) 创建 Asp.net MVC 模板,然后注册一个新用户。

结果:我们可以在本地数据库中找到用户信息。

2) 使用实体框架添加带有视图的控制器。并使用 Azure SQL 数据库作为其资源。

结果:我们会在 web.config 中找到两个连接

3) 删除默认连接字符串

4) 更改应用程序数据库上下文连接字符串

   <add name="jambdbEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=tcp:jambdb.database.windows.net,1433;initial catalog=jambdb;user id=jambor;password=***;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    
        public ApplicationDbContext()
            : base("jambdbEntities", throwIfV1Schema: false)
        
        

        public static ApplicationDbContext Create()
        
            return new ApplicationDbContext();
        
    

经过上述步骤,我的应用程序给我以下错误:

解决方案

1) 编辑“DefaultConnection”连接字符串

  <connectionStrings>
    <add name="jambdbEntitiesapplication"   providerName="System.Data.SqlClient" connectionString="Server=tcp:jambdb.database.windows.net,1433;Initial Catalog=jambdb;Persist Security Info=False;User ID=jambor;Password=***;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" />
    <add name="jambdbEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=tcp:jambdb.database.windows.net,1433;initial catalog=jambdb;user id=jambor;password=***;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

2) 修改代码:

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    
        public ApplicationDbContext()
            : base("jambdbEntitiesapplication", throwIfV1Schema: false)
        
        

        public static ApplicationDbContext Create()
        
            return new ApplicationDbContext();
        
    

3) 修改Migrations文件夹下Configuration类中的AutomaticMigrationsEnabled = true;

结果如下:

【讨论】:

这完全正确。我昨天自己找到了这个解决方案,但忽略了发布答案。不过,我会将您的答案标记为解决方案。我感谢您的帮助!谢谢! 我从旧版 WebForms 应用程序中得到了类似的结果,该应用程序正在迁移到 Azure。你能准确地解释需要什么吗?我看到你添加了一个连接字符串,但是为什么呢? 很好的答案,但迁移文件夹在哪里?这仍然是一件事吗?【参考方案2】:

使用您的数据库名称而不是传递连接字符串。检查我的示例中的数据库名称TestDB

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    
        public ApplicationDbContext()
            : base("TestDB", throwIfV1Schema: false)
        
        

        public static ApplicationDbContext Create()
        
            return new ApplicationDbContext();
        
    

【讨论】:

以上是关于实体类型 ApplicationUser 不是当前上下文模型的一部分。在项目开始时使用了两个不同的数据库的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 5 - 身份。如何获取当前的ApplicationUser

无法为“ApplicationUser”创建 DbSet,因为此类型未包含在上下文模型中

使用 Clean Architecture 从 ApplicationCore 库中的实体引用 Infrastructure 库中的 ApplicationUser

扩展MVC5和实体框架6 ApplicationUser导致用户注册无效列错误

在 MVC6 中扩展 Identity3

ASP.NET Identity 2.1 和 EF 6 - ApplicationUser 与其他实体的关系