41 votes

Comment éliminer l'erreur 3002?

Dire que j'ai la suite de définitions de table 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 ModelScore par Modèle, mais chaque Personne peut avoir un score pour un certain nombre de Modèles définis. Aussi loin que je peux dire, c'SQL doit faire respecter ces contraintes naturellement. Le ModelScore a un "sens", qui est contenue dans la Définition. Rien de fracassant là.

Maintenant, j'essaie de traduire ce dans le Cadre de l'Entité à l'aide de la designer. Après la mise à jour du modèle de la base de données et en faisant le montage, j'ai une Personne, un objet, un objet de Modèle, et un ModelScore objet. PersonModelScore, étant une table de jointure n'est pas un objet mais plutôt est inclus comme une association avec un autre nom (disons ModelScorePersonAssociation). La cartographie de détails pour l'association sont les suivants:

- Association
 - Cartes de PersonModelScore
 - ModelScore
 ModelId : Int32 <=> ModelId : int
 Score : Int32 <=> Score : int
 - Personne
 PersonId : Int32 <=> PersonId : int

Sur le côté droit, le ModelId et PersonId valeurs de clé primaire symboles, mais le Score ne prend pas de valeur.

Lors de la compilation, j'obtiens:

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'ai-je fait de mal dans le concepteur ou le contraire, et comment puis-je corriger l'erreur?

Merci beaucoup!

65voto

Shan Plourde Points 4631

Très tard à votre question, j'ai eu le même problème et j'ai découvert que le concepteur de structure d'entité avait identifié ma colonne "ScoreId" (par rapport à votre table PersonModelScore) comme une colonne de clé primaire. J'ai changé mon réglage sur false pour mon ScoreId, et tout a bien fonctionné par la suite.

13voto

Dhandapani Points 31

Vous pouvez définir une seule clé primaire dans l'entité afin d'éviter cette erreur. Cliquez avec le bouton droit sur les propriétés scalaires du champ dans l'entité et désactivez la clé d'entité s'il y a plusieurs clés primaires.

2voto

Shiraz Bhaiji Points 34901

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

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

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

0voto

freddoo Points 2310

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ème TOUS mes champs avaient été marqués Clé d'entité par EF

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X