【问题标题】:Invalid object name 'dbo.AspNetUsers' in Asp.NET MVC 5 Entity FrameworkAsp.NET MVC 5 Entity Framework 中的对象名称“dbo.AspNetUsers”无效
【发布时间】:2016-10-28 16:49:45
【问题描述】:

如果您有一个现有的数据库,并且想要在其中包含 ASP.NET 标识表,则可能会遇到此错误。当您开始时,您可能不知道如何将 [AspNetRoles]、[AspNetUserClaims]、[AspNetUsers]、[AspNetUserLogins] 表集成到现有数据库中。尽管有很多关于这个主题的资源,但这个答案试图简短而切题。您可能希望将 Entity Framework 中的 Database-First 方法与 ASP.NET MVC 的 ASP.NET Identity 功能一起使用。这是一个非常简短的傻瓜教程。如果我的英语不好,我很抱歉。

【问题讨论】:

    标签: asp.net asp.net-mvc entity-framework asp.net-mvc-5 asp.net-identity


    【解决方案1】:

    这是 Asp.NET Identity 表与现有数据库的最短集成。

    1) 在 Visual Studio(2015 或 2013)中打开新项目或现有项目。打开您的 Server Explorer 并打开您的 DefaultConnection。找到您的 Identity 表。 (在 WebConfig 文件中,localDB 连接字符串应该处于活动状态。而您的其他现有数据库的连接字符串不应处于活动状态。)双击您的 [AspNetRoles]、[AspNetUserClaims]、[AspNetUsers]、[AspNetUserLogins] 表.并复制他们所有的 SQL 代码。

    2) 在您的 SQL Server Management Studio 中打开您现有的数据库,右键单击您的数据库,然后单击 New Query 将您在第 1 部分中复制的内容过去。你会过去这样的事情:

    CREATE TABLE [dbo].[AspNetRoles] (
    [Id]   NVARCHAR (128) NOT NULL,
    [Name] NVARCHAR (256) NOT NULL,
    CONSTRAINT [PK_dbo.AspNetRoles] PRIMARY KEY CLUSTERED ([Id] ASC)
    );
    
    
    GO
    CREATE UNIQUE NONCLUSTERED INDEX [RoleNameIndex]
    ON [dbo].[AspNetRoles]([Name] ASC);
    
    
    
    CREATE TABLE [dbo].[AspNetUsers] (
    [Id]                   NVARCHAR (128) NOT NULL,
    [Email]                NVARCHAR (256) NULL,
    [EmailConfirmed]       BIT            NOT NULL,
    [PasswordHash]         NVARCHAR (MAX) NULL,
    [SecurityStamp]        NVARCHAR (MAX) NULL,
    [PhoneNumber]          NVARCHAR (MAX) NULL,
    [PhoneNumberConfirmed] BIT            NOT NULL,
    [TwoFactorEnabled]     BIT            NOT NULL,
    [LockoutEndDateUtc]    DATETIME       NULL,
    [LockoutEnabled]       BIT            NOT NULL,
    [AccessFailedCount]    INT            NOT NULL,
    [UserName]             NVARCHAR (256) NOT NULL,
    CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED ([Id] ASC)
    );
    
    
    GO
    CREATE UNIQUE NONCLUSTERED INDEX [UserNameIndex]
    ON [dbo].[AspNetUsers]([UserName] ASC);
    
    
    CREATE TABLE [dbo].[AspNetUserRoles] (
    [UserId] NVARCHAR (128) NOT NULL,
    [RoleId] NVARCHAR (128) NOT NULL,
    CONSTRAINT [PK_dbo.AspNetUserRoles] PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC),
    CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[AspNetRoles] ([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE
     );
    
    
    GO
    CREATE NONCLUSTERED INDEX [IX_UserId]
    ON [dbo].[AspNetUserRoles]([UserId] ASC);
    
    
    GO
    CREATE NONCLUSTERED INDEX [IX_RoleId]
    ON [dbo].[AspNetUserRoles]([RoleId] ASC);
    
    
    
    CREATE TABLE [dbo].[AspNetUserLogins] (
    [LoginProvider] NVARCHAR (128) NOT NULL,
    [ProviderKey]   NVARCHAR (128) NOT NULL,
    [UserId]        NVARCHAR (128) NOT NULL,
    CONSTRAINT [PK_dbo.AspNetUserLogins] PRIMARY KEY CLUSTERED ([LoginProvider] ASC, [ProviderKey] ASC, [UserId] ASC),
    CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE
    );
    
    
    GO
    CREATE NONCLUSTERED INDEX [IX_UserId]
    ON [dbo].[AspNetUserLogins]([UserId] ASC);
    
    
    
    CREATE TABLE [dbo].[AspNetUserClaims] (
    [Id]         INT            IDENTITY (1, 1) NOT NULL,
    [UserId]     NVARCHAR (128) NOT NULL,
    [ClaimType]  NVARCHAR (MAX) NULL,
    [ClaimValue] NVARCHAR (MAX) NULL,
    CONSTRAINT [PK_dbo.AspNetUserClaims] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE
    );
    
    
    GO
    CREATE NONCLUSTERED INDEX [IX_UserId]
    ON [dbo].[AspNetUserClaims]([UserId] ASC);
    

    如果您忘记了以 GO 开头的行,您将准确看到该问题标题中的错误。运行此查询并等待成功创建表。您现有的数据库现在已准备好使用 Asp.NET MVC 5 的身份功能。

    3) 在 Visual Studio 中打开 WebConfig。我们将在这里更改连接字符串。写这个:

     <add name="DefaultConnection" connectionString="Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;Persist Security Info=True;User ID=YOUR_USER_ID;Password=YOUR_PASSWORD.;MultipleActiveResultSets=True;Application Name=EntityFramework"  providerName="System.Data.SqlClient"/>
    

    而不是 localDB 连接字符串。这是什么:

     <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-....mdf;Initial Catalog=aspnet-...;Integrated Security=True" providerName="System.Data.SqlClient" />
    

    这就是你需要做的。运行您的项目并注册。您可以在现有数据库中的 AspNetUsers 表中查看新用户数据。

    【讨论】:

    • 嗨@Alparslan,还有另一种方法可以做到这一点。像在第 3 节中所做的那样更改连接字符串。然后在网页上注册用户。您将看到正在创建的 5 个表。
    • 感谢您的回答。我在这里的一些问题中看到了您的解决方案。但这在我的情况下不起作用。或者,也许我做错了什么。我有一些错误。而不是在互联网上研究这些错误,如果有人遇到这些错误,他们可以使用这个解决方案。
    • 你救了我的命。出于某种原因,我有 2 个 DBContext 类(IdentityContext 和自定义上下文)。当自定义上下文发生变化时,我删除了我的数据库。身份上下文没有重新创建表。嗯
    【解决方案2】:

    我遇到了同样的问题,在这里我忘记调用 EnsureCreated()。 调用此方法后,它将创建 Identity 所需的所有表。

    Startup.cs

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
    {
            ...
    
            // Make sure we have the database
            serviceProvider.GetService<ApplicationDbContext>().Database.EnsureCreated();
    }
    

    【讨论】:

    • 这仅适用于您的解决方案中有Data -&gt; Migrations 的情况。如果您像我一样删除了迁移文件,这将无济于事。
    【解决方案3】:

    在 Visual Studio 中转到“工具 -> NuGet 包管理器 -> 包管理器控制台”并在控制台窗口(在 Visual Studio 中)执行“更新数据库”命令

    【讨论】:

    • 这不太正确。根据这篇文章link 我必须在 PS 中发出 3 个命令:Enable-Migrations Add-Migration Init Update-Database
    • blazer SqlException: Invalid object name 'AspNetUsers'... 00000000000000_CreateIdentitySchema.cs 代码未执行。在我从包管理器控制台发出以下命令之前,没有在我的数据库中创建身份表:Update-Database 当然,首先需要在 appsettings.json 中设置正确的连接字符串
    【解决方案4】:

    我遇到了同样的问题。
    有时用户为会员创建自定义类,因此 asp.net 不创建 AspNetUsers
    示例:

    public class Member : IdentityUser
    {
        Public int MemberID { get; set; }
        public string Name { get; set; }
        public string Family { get; set; }
        public string Password { get; set; }
    
    }  
    

    在这种情况下,ASP.NET 创建Member 表,当用户想要进行身份验证时,ASP.NET 搜索AspNetUsers 并没有找到该表。 通过在自定义类的开头添加 TableAttribute 解决了这个问题

    [Table("AspNetUsers")]
    public class Member : IdentityUser
    {
        Public int MemberID { get; set; }
        public string Name { get; set; }
        public string Family { get; set; }
        public string Password { get; set; }
    
    }
    

    【讨论】:

      【解决方案5】:

      与上述类似,您可以在 ConfigureServices 中执行此操作

      services.Configure<ApplicationDbContext>(o =>
      {
        // Make sure the identity database is created
        .o.Database.Migrate();
      });
          //     Applies any pending migrations for the context to the database. Will create the
          //     database if it does not already exist.
          //     Note that this API is mutually exclusive with DbContext.Database.EnsureCreated().
          //     EnsureCreated does not use migrations to create the database and therefore the
          //     database that is created cannot be later updated using migrations.
      

      【讨论】:

        【解决方案6】:

        删除文件夹 /.vs/[solution_name]/DesignTimeBuild。 命令行下一个:dotnet ef database update --context [your_db_context_name] 它对我有用。

        【讨论】:

          【解决方案7】:

          转到包管理器控制台,

          复制粘贴这一行 --> 添加迁移初始化 --> 按回车

          复制粘贴这一行 --> 更新数据库 --> 按回车

          【讨论】:

            【解决方案8】:

            最快的方法是重新创建一个新项目并选择对个人的身份验证。然后用旧文件代替新文件。

            【讨论】:

              猜你喜欢
              • 2015-02-06
              • 1970-01-01
              • 1970-01-01
              • 2018-03-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-11-25
              相关资源
              最近更新 更多