Decir que tengo las siguientes definiciones de tabla en SQL Server 2008:¿Cómo elimino el error 3002?
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))
La idea aquí es que cada persona puede tener sólo una ModelScore por modelo, pero cada persona puede tener una puntuación para cualquier número de modelos definidos. Por lo que puedo decir, este SQL debe hacer cumplir estas restricciones de forma natural. El ModelScore tiene un "significado" particular, que está contenido en la Definición. Nada que rompa la tierra allí.
Ahora, intento traducir esto en Entity Framework usando el diseñador. Después de actualizar el modelo de la base de datos y hacer algunas modificaciones, tengo un objeto Person, un objeto Model y un objeto ModelScore. PersonModelScore, al ser una tabla de unión, no es un objeto, sino que se incluye como una asociación con algún otro nombre (digamos ModelScorePersonAssociation). Los detalles de mapeo para la asociación son los siguientes:
- Association - Maps to PersonModelScore - ModelScore ModelId : Int32 <=> ModelId : int Score : Int32 <=> Score : int - Person PersonId : Int32 <=> PersonId : int
En el lado de la derecha, los valores ModeloId y PERSONID tienen símbolos de clave primaria, pero el valor de la puntuación no lo hace.
Tras la compilación, me sale:
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é he hecho mal en el diseñador o no, y cómo puedo solucionar el error?
¡Muchas gracias!
Deberías aceptar la respuesta de Shan. Es correcto y salvó mi tocino. –