40

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!

+1

Deberías aceptar la respuesta de Shan. Es correcto y salvó mi tocino. –

Respuesta

2

Debe crear una sola clave de identidad para cada tabla.

ModelScore debe tener un ID de modelo, PersonModelScore debe tener un ID de dispositivo de movilidad humana.

Las referencias entre tablas deben ser un solo campo.

+1

Gracias por sus sugerencias. Ahora, ¿cómo esta solución aún preserva la integridad del modelo de datos? Cada Persona está asociada con no más de uno de cada Modelo, y el ModelScore debe ser un ModelScore válido para ese Modelo. Por lo tanto, creo que PersonModelScore tendría que tener un ModelId y un ModelScoreId, que es redundante y requiere verificación, o simplemente tiene ModelScoreId, que requiere la verificación de que no hay MultipleScores por modelo por persona. De ninguna manera parece funcionar muy bien, en mi opinión. ¿Esto es solo una limitación de Entity Framework, entonces? – Andrew

65

Muy tarde a su pregunta, tuve el mismo problema y descubrí que el diseñador del marco de entidades había identificado mi columna "ScoreId" (relativa a su tabla PersonModelScore) como una columna de clave principal. Cambié mi configuración a falso para mi ScoreId, y todo funcionó bien después.

+0

Esta corrección funcionó para mí. Una mesa tenía dos claves principales cuando debería haber tenido una sola. – Jesslyn

+2

Lo mismo aquí. EF decidió que todas las columnas no nulas deberían formar parte de la clave principal, que no deberían ser. –

+7

Me tomó un poco descubrir los pasos para esto, así que agregue aquí para mayor claridad. Vaya a su archivo .edmx, haga clic con el botón secundario en el fondo y seleccione 'Mapeo de detalles'. Haga clic en la Tabla que necesita para editar las asignaciones de en su ventana .edmx y los detalles deben aparecer en su nueva ventana 'Mapping Details'. Pulse F4 para que aparezca la ventana 'Propiedades' (ubicación predeterminada, en la parte inferior derecha de su pantalla VS). Haga clic en 'Valor/Propiedad' en su 'Detalles de mapeo' para cambiar las Propiedades que se muestran, y desde su ventana Propiedades ahora puede establecer el valor 'Clave de la entidad' en 'Falso'. –

0

Su mesa PersonModelScore debe definir una columna de ID que es la identidad y la clave primaria, entonces se debe crear una clave única en PERSONID, ModeloId

como para el error 3002, que tenía el mismo problema TODO mi campo ha sido marcada con la clave Entidad mediante EF

12

Puede establecer una clave primaria única en la entidad para evitar este error. Haga clic derecho sobre las propiedades escalares del campo en la entidad y deshabilite la clave de entidad si hay muchas claves primarias.

+0

¡Gracias! Esto resuelto para mí, Error Error 3002: Problema al mapear fragmentos comenzando en la línea 942: Violación potencial del tiempo de ejecución de las claves de la tabla [tablename] ([entityname] .Id): Columnas ([entityname] .Id) se asignan a las propiedades de EntitySet [conjunto de entidades] ([nombre de tabla] .Id) en el lado conceptual, pero no forman las propiedades clave de EntitySet –

0

"Vaya a su archivo .edmx, haga clic derecho en el fondo y seleccione 'Mapeo de detalles'. Haga clic en la tabla que necesita editar las asignaciones en su ventana .edmx y los detalles deben aparecer en su nuevo 'Mapeo Ventana de detalles Abra la pestaña Propiedades (presione F4 para que aparezca 'Propiedades' si no está abierto) Haga clic en 'Valor/Propiedad' en su 'Mapeo de detalles' para cambiar las Propiedades que se muestran, y desde su ventana Propiedades ahora puede establecer el valor de 'Clave de entidad' a 'Falso'. - Chris Paton 4 de octubre de 14 a 18:54 "

Esto funcionó para mí - Gracias Esto ahora es parte de mi flujo de trabajo al utilizar EF Database First. Y tenemos una tarea para actualizar el modelo de datos.

Cuestiones relacionadas