web-dev-qa-db-fra.com

Comment puis-je éliminer l'erreur 3002?

Disons que j'ai les définitions de table suivantes dans SQL Server 2008:

CREATE TABLE Person
(PersonId INT IDENTITY NOT NULL PRIMARY KEY,
 Name VARCHAR(50) NOT NULL,
 ManyMoreIrrelevantColumns VARCHAR(MAX) NOT NULL)

CREATE TABLE Model
(ModelId INT IDENTITY NOT NULL PRIMARY KEY,
 ModelName VARCHAR(50) NOT NULL,
 Description VARCHAR(200) NULL)

CREATE TABLE ModelScore
(ModelId INT NOT NULL REFERENCES Model (ModelId),
 Score INT NOT NULL,
 Definition VARCHAR(100) NULL,
 PRIMARY KEY (ModelId, Score))

CREATE TABLE PersonModelScore
(PersonId INT NOT NULL REFERENCES Person (PersonId),
 ModelId INT NOT NULL,
 Score INT NOT NULL,
 PRIMARY KEY (PersonId, ModelId),
 FOREIGN KEY (ModelId, Score) REFERENCES ModelScore (ModelId, Score))

L'idée ici est que chaque personne ne peut avoir qu'un seul ModelScore, mais chaque personne peut avoir un score pour un nombre quelconque de modèles définis. Autant que je sache, ce SQL devrait appliquer ces contraintes naturellement. Le ModelScore a une "signification" particulière qui est contenue dans la définition. Rien ne brise la terre là-bas.

Maintenant, j'essaie de traduire cela dans Entity Framework à l'aide du concepteur. Après la mise à jour du modèle à partir de la base de données et quelques modifications, j'ai un objet Personne, un objet Modèle et un objet ModelScore. PersonModelScore, en tant que table de jointure, n'est pas un objet mais est plutôt inclus en tant qu'association avec un autre nom (par exemple, ModelScorePersonAssociation). Les détails de mappage pour l'association sont les suivants:

Association
 - Mappe vers PersonModelScore 
 - ModelScore 
 ModelId: Int32 <=> ModelId: int 
 Score: Int32 <=> Score: int 
 - Person 
 PersonId: Int32 <=> PersonId: int 

Sur le côté droit, les valeurs ModelId et PersonId ont des symboles de clé primaire, mais pas la valeur Score.

Lors de la compilation, je reçois:

Error 3002: Problem in Mapping Fragment starting at line 5190: Potential runtime violation of table PersonModelScore's keys (PersonModelScore.ModelId, PersonModelScore.PersonId): Columns (PersonModelScore.PersonId, PersonModelScore.ModelId) are mapped to EntitySet ModelScorePersonAssociation's properties (ModelScorePersonAssociation.Person.PersonId, ModelScorePersonAssociation.ModelScore.ModelId) on the conceptual side but they do not form the EntitySet's key properties (ModelScorePersonAssociation.ModelScore.ModelId, ModelScorePersonAssociation.ModelScore.Score, ModelScorePersonAssociation.Person.PersonId).

Qu'est-ce que j'ai mal fait chez le concepteur ou autrement, et comment puis-je corriger l'erreur?

Merci beaucoup!

40
Andrew

Très tard pour votre question, j'avais le même problème et j'ai découvert que le concepteur de la structure d'entité avait identifié ma colonne "ScoreId" (relative à votre table PersonModelScore) en tant que colonne de clé primaire. J'ai changé mon paramètre en faux pour mon ScoreId, et tout a bien fonctionné par la suite. 

65
Shan Plourde

Vous pouvez définir une clé primaire unique dans l'entité afin d'éviter cette erreur.Cliquez à droite sur les propriétés scalaires du champ de l'entité et désactivez la clé d'entité s'il existe plusieurs clés primaires.

12
Dhandapani

Vous devez créer une clé d'identité unique pour chaque table.

ModelScore devrait avoir un ModelScoreId, PersonModelScore devrait avoir un PersonModelScoreId.

Les références entre les tables doivent être un seul champ.

2
Shiraz Bhaiji

Votre table PersonModelScore doit définir une colonne Id qui est l'identité et la clé primaire, puis Vous devez créer une clé unique sur PersonId, ModelId.

comme pour l'erreur 3002, j'ai eu le même problèmeTOUSmon champ a été marqué clé d'entité par EF

0
freddoo

"Allez dans votre fichier .edmx, faites un clic droit sur l’arrière-plan et sélectionnez" Détails de mappage ". Cliquez sur le tableau dont vous avez besoin pour modifier les mappages de votre fenêtre .edmx. Les détails doivent apparaître dans votre nouvelle fenêtre" Mappage ". Onglet Propriétés ouvert (Appuyez sur F4 pour faire apparaître les propriétés si elles ne sont pas ouvertes) Cliquez sur "Valeur/Propriété" dans les "Détails du mappage" pour modifier les propriétés affichées. Dans la fenêtre Propriétés, vous pouvez maintenant définir la "Clé de l'entité". 'value to' False '. - Chris Paton le 4 oct '14 à 18:54 "

Cela a fonctionné pour moi - Merci Cela fait maintenant partie de mon flux de travail lorsque j'utilise EF Database First. Et nous avons pour tâche de mettre à jour le modèle de données.

0
Lawrence Patrick