web-dev-qa-db-fra.com

Erreur 3002: problème de mappage de fragments | c # linq aux entités

J'ai une application console et ce que j'essaie de faire, c'est que chaque fois que l'application s'exécute, la date et l'heure sont envoyées à une table dans ma base de données.

La structure de la table est la suivante:

FTPRuns

ID int

Last Run datetime

Assez simple.

J'ai également mis à jour le fichier model.edmx dans mon application pour refléter ce nouveau changement, mais maintenant j'obtiens l'erreur ci-dessous et je ne suis pas tout à fait sûr de ce que cela signifie.

Erreur 3002: problème dans le mappage des fragments à partir de la ligne 1330: violation d'exécution potentielle des clés de la table FTPRuns (FTPRuns.ID): les colonnes (FTPRuns.ID) sont mappées aux propriétés EntitySet FTPRuns (FTPRuns.ID) du côté conceptuel, mais elles ne le font pas forment les propriétés de clé de l'EntitySet (FTPRuns.ID, FTPRuns.LastRun).

Voici l'extrait de code que j'utilise également pour mettre à jour la base de données:

 using (ModelContainer ctn = new ModelContainer())
            {
                try
                {
                    FTPRun ftp = new FTPRun
                    {
                        LastRun = DateTime.Now
                    };

                    ctn.FTPRuns.AddObject(ftp);

                    int changes = ctn.SaveChanges();

                    Console.WriteLine(changes.ToString() + " Changes saved");
                    Console.WriteLine("The LastRun Date Has Been Updated");
                }
                catch (InvalidOperationException ex)
                {
                     Console.WriteLine(ex.ToString());
                }
            }

Si quelqu'un peut m'aider, je vous en serais très reconnaissant :)

merci.

58
109221793

Votre modèle d'entité a la combinaison des deux propriétés FTPRuns.ID et FTPRuns.LastRun comme clé d'entité alors que votre table n'a que la colonne FTPRuns.ID comme clé primaire. Donc, dans votre modèle, vous spécifiez que la combinaison de FTPRuns.ID et FTPRuns.LastRun doit être unique alors que votre base de données a l'exigence la plus forte que FTPRuns.ID seul doit être unique.

Excluez simplement la propriété FTPRuns.LastRun à partir de la clé d'entité. Peut-être que cela s'est produit accidentellement ou que Entity Framework n'a pas pu obtenir les informations de clé primaire de la base de données et a dû déduire la clé d'entité. Par exemple, les vues n'ont pas de clé primaire et Entity Framework déduira la clé d'entité comme la combinaison de toutes les colonnes non nullables.

93
Daniel Brückner

Daniel Brückner la solution a parfaitement fonctionné pour moi! Voici essentiellement ce qu'il a demandé, mais sous forme graphique - ce qui peut aider les lecteurs paresseux :).

Ce que vous voulez rechercher, c'est que votre PK dans le modèle, c'est-à-dire.

enter image description here

Nous pouvons voir que j'ai un PK appelé id. Maintenant, si je regarde mon modèle EF:

enter image description here

Je ne vois qu'une seule clé spécifiée, ce qui est correct. Pour moi, ce n'était pas le cas, les 4 colonnes étaient des clés.

Si vous cliquez avec le bouton droit sur la colonne (dans le diagramme EF sur VS), vous aurez la possibilité de cocher/décocher le Entity Key:

enter image description here

Assurez-vous que cela correspond à votre modèle. Dans mon cas, seul id doit être coché, enregistrer et construire le projet.

42
benscabbia

cela m'est arrivé lorsque j'ai changé le champ clé de la table (dans la base de données) et mis à jour le modèle d'entité.

L'ancienne clé était toujours là dans le modèle, alors je suis allé dans les propriétés de l'objet dans le fichier .edmx et j'ai défini la clé sur False. Cela l'a corrigé.

19
KevinDeus

J'ai effacé la table de l'edmx (sur edmx choisissez la table qui pose problème -> clic droit -> supprimer) et ensuite effectuez "modèle mis à jour depuis la base de données"

qui l'a réparé pour moi

15
Dush

J'ai supprimé l'entité et la classe du navigateur de modèles et j'ai effectué une mise à jour à partir de la base de données en veillant à sélectionner la table. Cela a résolu le problème pour moi.

5
Mitch Stewart

J'ai oublié de définir une clé primaire lors de la création d'une nouvelle table, donc je suis allé à SQL Management Studio pour le faire. Une fois cela fait, j'ai mis à jour le fichier model.edmx pour refléter les changements et j'ai obtenu l'erreur 3002.

Ce qu'il avait fait, lors de la mise à jour du modèle, était de définir toutes les colonnes du tableau comme des "clés d'entité". Ainsi, lorsque vous affichez le fichier model.edmx, recherchez la table appropriée et cliquez avec le bouton droit sur les différentes propriétés pour vous assurer que seule la clé primaire a "Clé d'entité" sélectionnée. Cela a résolu mon problème.

3
DSF

J'ai effacé toutes les tables de l'edmx puis "Mettre à jour le modèle de la base de données". Vérifiez également d'avoir un propriétaire de la base de données.

2
danicode

Vérifiez la clé primaire de la table, si elle existe, puis 1) Ouvrez le fichier .edmx, sélectionnez toutes les tables et supprimez du modèle. 2) Mettre à jour le modèle à partir de la base de données et ajouter à nouveau toutes les tables requises

2
Madhava Reddy