web-dev-qa-db-fra.com

Nom d'objet non valide 'dbo.AspNetUsers' dans Asp.NET MVC 5 Entity Framework

Si vous avez une base de données existante et que vous souhaitez y inclure des tables d’identité Asp.NET, vous pouvez faire face à cette erreur. Également au début, vous ne savez peut-être pas comment intégrer [AspNetRoles], [AspNetUserClaims], [AspNetUsers], [AspNetUserLogins] tables dans votre base de données existante. Bien qu'il existe de nombreuses ressources sur ce sujet, cette réponse est l'une des plus courtes. Vous souhaiterez peut-être utiliser l'approche Database-First dans Entity Framework, à côté de la fonctionnalité d'identité Asp.NET de Asp.NET MVC. Ceci est un tutoriel très court pour les nuls. Désolé pour mon anglais s'il est pauvre.

6
Alp

Voici l'intégration la plus courte des tables Asp.NET Identity à votre base de données existante. 

1) Ouvrez un nouveau projet ou votre projet existant dans Visual Studio (2015 ou 2013). Ouvrez votre Server Explorer et ouvrez votre DefaultConnection . Recherchez vos tables d’identité. (Dans le fichier WebConfig, la chaîne de connexion localDB doit être active. La chaîne de connexion de votre autre base de données existante ne doit pas l'être). Double-cliquez sur vos [AspNetRoles], [AspNetUserClaims], [AspNetUsers], [AspNetUserLogins] tables. Et copiez tous leurs codes SQL. 

2) Ouvrez votre base de données existante dans votre SQL Server Management Studio, cliquez avec le bouton droit de la souris sur votre base de données et cliquez sur Nouvelle requête collez ici ce que vous avez copié dans la 1ère partie. Vous passerez quelque chose comme ça: 

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);

Si vous oubliez les lignes qui commencent par GO, vous verrez exactement l'erreur qui se trouve dans Titre de cette question. Exécutez cette requête et attendez la création des tables avec succès. Votre base de données existante est maintenant prête pour les fonctionnalités d'identité de Asp.NET MVC 5. 

3) Ouvrez WebConfig dans votre Visual Studio. Nous allons changer connectionstring ici. Écrire cela:

 <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"/>

Au lieu de chaîne de connexion localDB. Quel est ce:

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

C'est tout ce que vous devez faire. Exécutez votre projet et inscrivez-vous. Vous pouvez voir vos nouvelles données utilisateur dans la table AspNetUsers, dans votre base de données existante.

14
Alp

Dans Visual Studio, allez dans "Outils -> Gestionnaire de paquets NuGet -> Console du gestionnaire de paquets" et dans la fenêtre de la console (à l'intérieur de Visual Studio), exécutez la commande "Update-Database".

4
Kuleris

J'ai vécu ça.
utilisateur de temps créer une classe de personnalisation pour l'appartenance donc asp.net ne crée pas de table AspNetUsers
Exemple : 

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

}  

dans ce scénario, ASP.NET crée une table de membre et, lorsque l'utilisateur souhaite s'authentifier, ASP.NET recherche AspNetUsers et n'a pas trouvé cette table.

[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

J'ai rencontré le même problème, ici j'avais oublié d'appeler EnsureCreated () . Après avoir appelé cette méthode, toutes les tables requises par Identity seront créées.

Startup.cs

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

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