Подтвердить что ты не робот

Как устранить ошибку 3002?

Скажем, у меня есть следующие определения таблиц в 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). Сведения о сопоставлении для ассоциации заключаются в следующем:

- Association
  - 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 keys (PersonModelScore.ModelId, PersonModelScore.PersonId): Columns (PersonModelScore.PersonId, PersonModelScore.ModelId) are mapped to EntitySet ModelScorePersonAssociation properties (ModelScorePersonAssociation.Person.PersonId, ModelScorePersonAssociation.ModelScore.ModelId) on the conceptual side but they do not form the EntitySet key properties (ModelScorePersonAssociation.ModelScore.ModelId, ModelScorePersonAssociation.ModelScore.Score, ModelScorePersonAssociation.Person.PersonId).

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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