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

标签 asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-6 azure-web-app-service

我使用 Entity Framework 创建了一个 MVC 4 应用程序,用于读取数据并将数据写入我在 Azure 数据库上托管的数据库。 Azure 数据库应该保存应用程序数据和应用程序的登录数据。

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

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

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

然后,我更改了 IdentityModels.cs 中的 ApplicationDBContext 类以反射(reflect)以下更改...

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 中生成登录数据的表。

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

评论更新:

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;
    }
}

最佳答案

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

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

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

2) 使用 Entity Framework 添加带有 View 的 Controller 。并使用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();
        }
    }

执行上述步骤后,我的应用程序出现以下错误:

enter image description here

解决方案:

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;

结果如下:

enter image description here

关于asp.net-mvc - 实体类型 ApplicationUser 不是当前上下文模型的一部分。在项目开始时使用了两个不同的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41316188/

相关文章:

asp.net - 使用 Linq to SQL 返回单个值

c# - 无法映射列表<枚举>

c# - 在 Multi-Tenancy .net 项目中实现角色的最佳方式是什么?

c# - 在 EF Core 中应用所有 IEntityTypeConfiguration 派生类

javascript - Chrome 'please match the requested format' 验证消息

asp.net - MVC 4 - 用户模拟

asp.net - 数据输入后修剪字符串的最佳方法。我应该创建自定义模型 Binder 吗?

c# - 将 Rich Cards 数据添加到我的 dotnet 应用程序会导致其崩溃

c# - 使 ASP.NET 身份在 Mongo 中存储用户数据(托管在 Heroku 上)

c# - 使用 ASP.NET MVC 时如何设置新页面/ View 的 URL