【问题标题】:Change ASP.NET Identity to use existing database更改 ASP.NET 标识以使用现有数据库
【发布时间】:2014-11-10 01:56:18
【问题描述】:

我正在使用带有数据库优先工作流的 ASP.NET MVC 5。我已经在我现有的数据库中创建了身份表(AspNetUsersAspNetRoles 等),但是我无法让 registerlogin 功能正常工作适当地。

这是IdentityModels.cs

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("MyConnectionString") // I use "MyConnectionString" instead of "DefaultConnection" 
    {
    }

这是来自web.config 的 EF 连接字符串的样子

<connectionStrings><add name="MyConnectionString" connectionString="metadata=res://*/Entities.MyModel.csdl|res://*/Entities.MyModel.ssdl|res://*/Entities.MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=My-Pc\SQLEXPRESS;initial catalog=MyExistingDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

这里是从 edmx 生成的上下文类

public partial class MyConnectionString : DbContext
{
    public MyConnectionString()
        : base("name=MyConnectionString")
    {
    }

在我看来一切都很好,它应该能够在数据库中创建用户但是我分别在登录或尝试注册时收到以下错误:

登录:

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

第 73 行:var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

异常详细信息:System.InvalidOperationException:实体类型 ApplicationUser 不是当前上下文模型的一部分。

注册:

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

第 155 行:var result = await UserManager.CreateAsync(user, 型号.密码);

异常详细信息:System.InvalidOperationException:实体类型 ApplicationUser 不是当前上下文模型的一部分。

周围的大多数文章似乎都集中在 Code-First 以及如何从 LocalDb 到 SQLExpress 等以及如何更改连接字符串,但是我已经很长时间无法解决这个问题了。

编辑,解决方案:正如@ChrFin 提到的,您可以并排使用它们,这就是我最终要做的。我只是在web.config 中添加了一个新的regular 连接字符串,并让它指向现有的数据库。 PS。请记住,连接字符串名称不能与现有名称相同,并且必须与您提供给ApplicationDbContext 构造函数的名称相同。

【问题讨论】:

  • 从数据库更新您的 edmx 文件。只需右键单击解决方案资源管理器中的文件从数据库更新
  • 在 ApplicationDbContext 上下文中是 ApplicationUser,你应该在那里定义 DBSet
  • @ J.W。在那个问题上我不太同意你,我为什么要定义它?
  • 因为错误说实体类型ApplicationUser不是当前上下文模型的一部分

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


【解决方案1】:

您可以按照以下步骤解决此问题:

  • 1-在您的数据库上创建 aspnetuser 等表(无论您想要什么数据库 使用)
  • 只需将应用程序与该数据库连接,而不使用实体框架,我说的只是简单连接。
  • 您会在 web.config 文件中找到连接字符串。

  • 将此连接字符串放入身份模型 clss

  • 您的 Register 和 Token 方法现在正在运行
  • 现在您可以通过数据优先方法将实体框架用于其余表

【讨论】:

    【解决方案2】:

    我认为 ASP.NET Identity 不支持这种情况,因为它需要扩展 IdentityDbContext&lt;ApplicationUser&gt;(或类似名称)的 DbContext

    为什么要在 DB-First 上下文中强制使用 Identity?
    您可以将 Code-First 上下文与其他 DB-First 上下文一起用于 Identity,而不会出现问题...

    【讨论】:

    • 如果你强制意味着我可以简单地向构造函数提供 DefaultConnection 并让它创建一个新的数据库,那么我已经开始工作了。然而,在我看来,这是一个糟糕的“修补”。我本质上还想要的是与我拥有的现有表创建关系,即 AspNetUsers
    • 也许我误会了:据我所知,您正在尝试将 DB-first 上下文与登录/注册功能一起使用,而不是基于 IdentityDbContext&lt;ApplicationUser&gt; 的代码优先上下文 - 这不是案例?
    • 是的,你是对的,我想我也有点困惑。无论如何,这就是为什么我在其构造函数中为其提供了相同的连接字符串名称。如果我将它与它一起使用,我不知道该怎么做,您能否进一步解释一下。
    • 没有太多要解释的:使用ApplicationDbContext 代替ASP.NET Identity(您可以在默认的MVC 模板中查找),其余部分使用您的DB-first 上下文。只要桌子适合两种型号,您就可以使用...
    • 我熟悉但我不明白的是如何在不同数据库中的两个表之间创建关系。我不确定您所说的“只要表格适合两种模型..”是什么意思
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 2015-02-01
    • 2021-10-16
    相关资源
    最近更新 更多