Asp.NET MVC 5 实体框架中的对象名称“dbo.AspNetUsers”无效

问题描述 投票:0回答:10

如果您有现有数据库,并且想要将 ASP.NET Identity 表包含到其中,则可能会遇到此错误。当您开始时,您可能不知道如何将 [AspNetRoles]、[AspNetUserClaims]、[AspNetUsers]、[AspNetUserLogins] 表集成到现有数据库中。尽管有很多关于这个主题的资源,但这个答案尽量简短明了。您可能希望将实体框架中的数据库优先方法与 ASP.NET MVC 的 ASP.NET Identity 功能结合使用。这是一个非常简短的傻瓜教程。如果我的英语很差,我很抱歉。

asp.net asp.net-mvc entity-framework asp.net-mvc-5 asp.net-identity
10个回答
15
投票

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

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

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

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 表中查看新用户数据。


7
投票

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

Startup.cs

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

        // Make sure we have the database
        serviceProvider.GetService<ApplicationDbContext>().Database.EnsureCreated();
}

5
投票

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


3
投票

我遇到了同样的问题。
有时用户为成员资格创建自定义类,因此 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; }

}

1
投票

以下是我将

AspNetCore.Identity.EntityFramework
添加到具有现有 SQL 数据库的现有项目中所采取的步骤。与OP相同,我缺少使用该框架所需的数据库表。我正在运行 ASP.NET Core v6.0.5。

  1. 在 Visual Studio 中,使用
    ASP.NET Core Web App (Model-View-Controller)
    模板创建一个新的临时项目。选择身份验证类型
    Individual Accounts
  2. 打开
    Package Management Console
    (您可以在查看 -> 其他窗口 -> 包管理控制台下找到它)。
  3. Package Management Console 中,您可以通过键入
    Update-Database -Connection 'CON_STR'
    来初始化缺少的数据库表,其中
    CON_STR
    是您的数据库连接字符串。
    Package Management Console
    将创建表格。它还将打印用于创建它们的 SQL 查询。

创建 SQL 表后,我没有再遇到任何问题。 这是我的 Program.cs 文件中的代码:

builder.Services.AddDbContext<IdentityDbContext>(options => options.UseSqlServer(CON_STR));
builder.Services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<IdentityDbContext>().AddDefaultTokenProviders();

1
投票

与上面类似,您可以在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.

0
投票

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


0
投票

转到包管理器控制台,

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

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


0
投票

我今天遇到了同样的问题。以下 .NET CLI 命令对我有用。我需要从我的项目文件夹运行它们:

dotnet tool install dotnet-ef --version 8.0.* --global
dotnet ef migrations add CreateIdentitySchema
dotnet ef database update

我的理解是,它确保根据您的代码创建具有正确模式的所有必要的表。


-3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.