Как устранить ошибку 3002? - PullRequest
40 голосов
/ 14 мая 2010

Допустим, у меня есть следующие определения таблиц в 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))

Идея заключается в том, что у каждого человека может быть только один ModelScore на модель, но у каждого человека может быть балл за любое количество определенных моделей. Насколько я могу судить, этот SQL должен обеспечивать эти ограничения естественным образом. ModelScore имеет особое «значение», которое содержится в определении. Там нет ничего потрясающего.

Теперь я пытаюсь перевести это в Entity Framework с помощью дизайнера. После обновления модели из базы данных и некоторого редактирования у меня есть объект Person, объект Model и объект ModelScore. PersonModelScore, будучи таблицей соединений, не является объектом, а включается в качестве ассоциации с другим именем (скажем, ModelScorePersonAssociation). Подробности сопоставления для ассоциации следующие:

- <b>Association</b>
  - Maps to PersonModelScore
    - ModelScore
        ModelId : Int32       <=>  ModelId : int
        Score : Int32         <=>  Score : int
    - Person
        PersonId : Int32      <=>  PersonId : int

В правой части значения ModelId и PersonId имеют символы первичного ключа, а значение Score - нет.

При компиляции я получаю:

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).

Что я сделал не так в конструкторе или как-то иначе, и как я могу исправить ошибку?

Большое спасибо!

Ответы [ 5 ]

65 голосов
/ 05 марта 2011

Очень поздно к вашему вопросу, у меня возникла та же проблема, и я обнаружил, что разработчик структуры сущностей определил мой столбец "ScoreId" (относительно вашей таблицы PersonModelScore) как столбец первичного ключа. Я изменил настройку на false для своего ScoreId, и после этого все работало хорошо.

12 голосов
/ 11 июля 2012

Вы можете установить один первичный ключ в сущности, чтобы избежать этой ошибки. Щелкните правой кнопкой мыши на Скалярных свойствах поля в сущности и отключите ключ сущности, если имеется много первичных ключей.

2 голосов
/ 20 мая 2010

Вы должны создать один ключ идентификации для каждой таблицы.

ModelScore должен иметь ModelScoreId, PersonModelScore должен иметь PersonModelScoreId.

Ссылки между таблицами должны быть одним полем.

0 голосов
/ 18 августа 2017

"Перейдите к файлу .edmx, щелкните правой кнопкой мыши на фоне и выберите« Сведения о отображении ». Нажмите на таблицу, в которой необходимо отредактировать сопоставления, в окне .edmx, и сведения должны появиться в новом« Сведения о сопоставлении ». окно. Откройте вкладку «Свойства» (нажмите F4, чтобы вызвать «Свойства», если они не открыты). Нажмите «Значение / Свойство» в «Подробных данных сопоставления», чтобы изменить отображаемые свойства, и теперь в окне «Свойства» вы можете установить Значение «Entity Key» для «False» - Крис Патон, 4 октября '14 в 18:54 "

Это сработало для меня - спасибо Теперь это часть моего рабочего процесса при использовании EF Database First. И у нас есть задача обновить модель данных.

0 голосов
/ 09 июля 2012

Ваша таблица PersonModelScore должна определить столбец Id, который представляет собой идентификатор и первичный ключ, затем Вы должны создать уникальный ключ на PersonId, ModelId

как и для ошибки 3002, у меня была та же проблема ALL мое поле было помечено ключом Entity EF

...