无效的对象名称';dbo.AspNetUsers';在Asp.NET MVC 5实体框架中

无效的对象名称';dbo.AspNetUsers';在Asp.NET MVC 5实体框架中,asp.net,asp.net-mvc,entity-framework,asp.net-mvc-5,asp.net-identity,Asp.net,Asp.net Mvc,Entity Framework,Asp.net Mvc 5,Asp.net Identity,如果您有一个现有数据库,并且希望在其中包含ASP.NET标识表,则可能会遇到此错误。启动时,您可能不知道如何将[AspNetRoles]、[AspNetUserClaims]、[AspNetUsers]、[AspNetUserLogins]表集成到现有数据库中。虽然有很多关于这个主题的资料,但这个答案尽量简短和中肯。您可能希望在实体框架中使用数据库优先的方法以及ASP.NET MVC的ASP.NET标识特性。这是一个非常简短的假人教程。如果我的英语不好,我很抱歉。这里是Asp.NET标识表与现有

如果您有一个现有数据库,并且希望在其中包含ASP.NET标识表,则可能会遇到此错误。启动时,您可能不知道如何将[AspNetRoles]、[AspNetUserClaims]、[AspNetUsers]、[AspNetUserLogins]表集成到现有数据库中。虽然有很多关于这个主题的资料,但这个答案尽量简短和中肯。您可能希望在实体框架中使用数据库优先的方法以及ASP.NET MVC的ASP.NET标识特性。这是一个非常简短的假人教程。如果我的英语不好,我很抱歉。

这里是Asp.NET标识表与现有数据库的最短集成

1) 在Visual Studio中打开新项目或现有项目(2015或2013)。打开服务器资源管理器并打开默认连接。查找您的身份表。(在WebConfig文件中,localDB connectionstring应处于活动状态。其他现有数据库的连接字符串不应处于活动状态。)双击[AspNetRoles]、[AspNetUserClaims]、[AspNetUsers]、[AspNetUserLogins]表。并复制他们所有的SQL代码

2) 在SQL Server Management Studio中打开现有数据库,右键单击数据库,然后单击“新建查询”,将您在第一部分中复制的内容复制到此处。你会经历这样的事情:

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) 在VisualStudio中打开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表中查看新用户数据。

在Visual Studio中,转到“工具->NuGet Package Manager->Package Manager控制台”,并在控制台窗口(在Visual Studio中)执行“更新数据库”命令。

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

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创建
成员
表,当用户想要进行身份验证时,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; }

}

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

Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
{
        ...

        // Make sure we have the database
        serviceProvider.GetService<ApplicationDbContext>().Database.EnsureCreated();
}
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.
public void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、IServiceProvider服务提供商)
{
...
//确保我们有数据库
serviceProvider.GetService().Database.EnsureCreated();
}

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

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
{
        ...

        // Make sure we have the database
        serviceProvider.GetService<ApplicationDbContext>().Database.EnsureCreated();
}
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.
services.Configure(o=>
{
//确保已创建标识数据库
.o.Database.Migrate();
});
//将上下文的所有挂起迁移应用于数据库。将创建
//数据库(如果它不存在)。
//请注意,此API与DbContext.Database.EnsureCreated()是互斥的。
//EnsureRecreated不使用迁移来创建数据库,因此
//以后无法使用迁移更新创建的数据库。

删除文件夹/.vs/[solution\u name]/DesignTimeBuild。 命令行的下一步:dotnet ef database update--context[您的\u db\u context\u名称]
它适合我。

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

Hi@Alparslan,还有另一种方法。像在第3节中所做的那样更改连接字符串。然后在网页上注册用户。您将看到正在创建的5个表。谢谢您的回答。我在这里的一些问题中看到了你的解决方案。但这在我的情况下不起作用。也许我做错了什么。我犯了一些错误。与其在互联网上研究这些错误,如果有些人面临这些错误,他们可以使用这个解决方案。你救了我的命。出于某种原因,我有2个DBContext类(IdentityContext和CustomContext)。自定义上下文更改时,我删除了数据库。标识上下文未重新创建表。这不太正确。根据本文,我必须在PS:Enable Migrations Add Migration Init Update database中发出3个命令这只适用于解决方案中有
Data->Migrations
的情况。如果您像我一样删除了迁移文件,这将不会起任何作用。