web-dev-qa-db-fra.com

La clé d'erreur existe déjà dans le tableau lorsque le contrôleur d'échafaudage vs2015

J'essaie de suivre l'exemple de Music Store dans Professional MVC 4 à l'aide de VS2015. J'ai des problèmes pour échafauder le contrôleur du magasin de musique. À chaque fois que j'essaie de créer le contrôleur, une fenêtre d'erreur s'affiche. Seules les informations suivantes s'affichent: "Une erreur s'est produite lors de l'exécution du générateur de code sélectionné:" La clé existe déjà dans la table. ""

J'ai cherché autour de ces erreurs spécifiques, mais la plupart des solutions d'erreurs d'échafaudage semblent concerner des erreurs dans le fichier web.config; pourtant, rien n'a changé dans mon fichier web.config. Il s'agit de la solution par défaut créée lors de la création du nouveau projet.

J'ai essayé de créer un autre projet MVC et de coder à nouveau les modèles, mais le message d'erreur persiste.

J'utilise Microsoft Visual Studio Enterprise 2015 version 14.0.247200 Update 1 si cela aide.

Les classes que j'ai créées dans le dossier Modèles sont les suivantes et sont exactement telles qu'elles sont dans le livre:

public class Album
{
    public virtual int AlbumId { get; set; }
    public virtual int GenreId { get; set; }
    public virtual int ArtistId { get; set; }
    public virtual string Title { get; set; }
    public virtual decimal Price { get; set; }
    public virtual string AlbumArtUrl { get; set; }
    public virtual Genre Genre { get; set; }
    public virtual Artist Artist { get; set; }
}

public class Artist
{
    public virtual int ArtistId { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
}

public class Genre
{
    public virtual int GenreId { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual List<Album> Albums { get; set; }
}

Merci de votre aide

15
ObiEff

J'ai eu le même problème. J'utilise Visual Studio Communitty 2015. Essayez une classe de modèle avec le code:

public class MusicStoreDB : DbContext
{
    public MusicStoreDB() : base("name=MusicStoreDB")
    {
    }

    public DbSet<Album> Albums { get; set; }
    public DbSet<Artist> Artists { get; set; }
    public DbSet<Genre> Genres { get; set; }
}

Dans la fenêtre Ajouter un contrôleur, utilisez MusicStoreDB comme contexte.

Le code de travail peut être trouvé ici .

Le code du chapitre 4 semble avoir été généré à partir d'une base de données, de sorte que la classe MusicStoreDB est légèrement différente.

18
koolaccounts.net

J'ai eu les mêmes problèmes «La clé existe déjà dans le tableau». dans VS 2015 Pro et a constaté que si je fermais toutes les fenêtres de code ouvertes, effectuais un nettoyage, puis une reconstruction, et tentais à nouveau l’échafaudage, tout fonctionnait parfaitement! 

4
Owain Williams

Même problème pour moi sur VS 2015 Community Edition.

Je ne pouvais faire fonctionner un échafaudage que si je commentais ce qui suit dans la classe Album:

public virtual Genre  Genre { get; set; }
public virtual Artist Artist { get; set; }

Après l’échafaudage, vous pouvez supprimer les commentaires, corriger le contrôleur et visualiser.

2
VladimirSD

Auparavant, mes collègues travaillaient avec EF et il a été souligné que le bon fonctionnement des packages et de la version des packages est très important.Si vous ne vous trompez pas exactement, divers messages d'erreur non liés peuvent apparaître, tels que "La clé existe déjà dans l'erreur de table "message en essayant d’utiliser EF.

Puisqu'ils l'utilisent, j'ai décidé de lire le livre wrox Professional ASP.NET MVC 5 et je parcourais le chapitre 4 lorsque j'ai rencontré la même erreur que vous tous. Quoi qu'il en soit, j'ai téléchargé leur exemple de solution au chapitre 4 de

http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-5.productCd-1118794753,descCd-DOWNLOAD.html

comme suggéré et je copie le dossier de package de leur exemple et remplace le dossier de package dans mon projet et cela fonctionne. Le StoreManageController est créé

Maintenant, s'il vous plaît faire des commentaires si cela fonctionne pour tous.Il a fonctionné pour moi.J'utilise VS2015 Professional

1
C.Poh

Supprimez les propriétés de la clé étrangère:

public virtual int GenreId { get; set; }
public virtual int ArtistId { get; set; }
0
Khaled Mustapha

Etes-vous sûr que chaque propriété est marquée comme virtual dans les exemples? Je ne vois pas en quoi il serait logique que Name, Price, etc. soient des propriétés de navigation.

Essayez ce qui suit, en définissant uniquement les propriétés de navigation (éléments avec des relations) sur virtuel.

public class Album
{
    public int AlbumId { get; set; }
    public string Title { get; set; }
    public decimal Price { get; set; }
    public string AlbumArtUrl { get; set; }
    public int GenreId { get; set; }
    public virtual Genre Genre { get; set; }
    public int ArtistId { get; set; }
    public virtual Artist Artist { get; set; }
}

public class Artist
{
    public int ArtistId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

public class Genre
{
    public int GenreId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual List<Album> Albums { get; set; }
}
0
Thomas Boby

Dans mon cas, cela est dû à la sélection de la classe de contexte de données incorrecte dans la boîte de dialogue "Ajouter un contrôleur". Mon projet contenait 2 classes de contexte de données et je créais un nouveau contrôleur pour une classe de modèle déjà utilisé dans une autre classe de contexte de données. Le changement de classe de contexte de données a résolu cette erreur (la clé existe déjà ...) dans mon cas. Nettoyer, reconstruire, redémarrer VS (VS 2015 Pro) n'a pas aidé.

0
laza

J'ai eu le même problème et l'ai résolu en sélectionnant "Classe de contexte de données:" le contexte de {ConnectionName} Entities ({MyProject} .Models) et ApplicationDbContext ({MyProject} .Models).

0
timoconnell