web-dev-qa-db-ja.com

Asp.NET MVC 5エンティティフレームワークの無効なオブジェクト名 'dbo.AspNetUsers'

既存のデータベースがあり、それにASP.NET Identityテーブルを含めたい場合、このエラーに直面する可能性があります。また、最初は[AspNetRoles]、[AspNetUserClaims]、[AspNetUsers]、[AspNetUserLogins]テーブルを既存のデータベースに統合する方法がわからない場合があります。このトピックについては多くのリソースがありますが、この回答は簡潔で要点を絞っています。 Entity FrameworkのDatabase-FirstアプローチをASP.NET MVCのASP.NET Identity機能と一緒に使用することができます。これは、ダミー向けの非常に短いチュートリアルです。英語が苦手な方は申し訳ありません。

7
Alp

これは、Asp.NET Identityテーブルと既存のデータベースの最も短い統合です。

1)Visual Studio(2015または2013)で新しいプロジェクトまたは既存のプロジェクトを開きます。 サーバーエクスプローラーを開き、DefaultConnectionを開きます。IDテーブルを見つけます。 (WebConfigファイルでは、localDB接続文字列がアクティブである必要があります。他の既存のデータベースの接続文字列はアクティブであってはなりません。)[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のIdentity機能を使用できるようになります。

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テーブルで新しいユーザーデータを確認できます。

13
Alp

Visual Studioで「ツール-> NuGetパッケージマネージャー->パッケージマネージャーコンソール」に移動し、コンソールウィンドウ(Visual Studio内)で「Update-Database」コマンドを実行します。

4
Kuleris

同じ問題が発生します。ユーザーがメンバーシップのカスタマイズクラスを作成するため、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はメンバーテーブルを作成し、ユーザーが認証したい場合、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; }

}
3
AminM

同じ問題に直面しましたが、ここではEnsureCreated()を呼び出すのを忘れていました。このメソッドを呼び出した後、Identityに必要なすべてのテーブルを作成します。

Startup.cs

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

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

上記と同様に、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.
1
MorbidCamel

フォルダー/.vs/[solution_name]/DesignTimeBuildを削除します。次にコマンドラインから:dotnet ef database update --context [your_db_context_name]これは私にとってはうまくいきます。

0

最速の方法は、新しいプロジェクトを再作成し、個人に対する認証を選択することです。そして、古いファイルを代わりに新しいファイルに使用します。

0
TicTac