40

Скажем, у меня есть следующие определения таблицы в SQL Server 2008:Как устранить ошибку 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)) 

Идея заключается в том, что каждый человек может иметь только один 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'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).

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

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

+1

Вы должны принять ответ Шаня. Это правильно и спасло мою бекон. –

ответ

2

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

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

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

+1

Спасибо за ваши предложения. Теперь, как это решение по-прежнему сохраняет целостность модели данных? Каждый человек связан не более чем с одной из каждой модели, а ModelScore должен быть допустимым ModelScore для этой модели. Итак, я думаю, что PersonModelScore либо должен иметь как ModelId, так и ModelScoreId, который является избыточным и требует проверки, или просто имеет ModelScoreId, который требует проверки того, что не существует нескольких ModelScores для каждой модели на человека. На мой взгляд, ни один из способов не работает очень хорошо. Является ли это просто ограничением платформы Entity Framework? – Andrew

65

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

+0

Это исправление сработало для меня. У одной таблицы было два первичных ключа, когда у нее должен был быть только один. – Jesslyn

+2

То же самое здесь. EF решил, что все столбцы не-нуль должны быть частью первичного ключа, который они не должны быть. –

+7

Мне потребовалось немного времени, чтобы понять, как это сделать, поэтому добавьте здесь для ясности. Перейдите в ваш .edmx-файл, щелкните правой кнопкой мыши по фону и выберите «Отобразить детали». Нажмите на таблицу, которую вам нужно отредактировать сопоставления в вашем окне .edmx, и детали должны появиться в новом окне «Детали отображения». Нажмите F4, чтобы открыть окно «Свойства» (местоположение по умолчанию, внизу справа от вашего дисплея VS). Нажмите «Значение/Свойство» в «Детали отображения», чтобы изменить отображаемые свойства, и из окна «Свойства» вы можете теперь установить значение «Ключ сущности» «Ложно». –

0

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

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

12

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

+0

Спасибо! Это разрешилось для меня, Ошибка Ошибка 3002: Проблема при отображении фрагментов, начиная с строки 942: Потенциальное нарушение времени выполнения таблиц [имя_таблицы] [[имя_им.имя] .Id): Колонки ([имя_имя] .Id) сопоставлены к свойствам EntitySet [entityset] ([tablename] .Id) на концептуальной стороне, но они не образуют ключевые свойства EntitySet –

0

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

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

Смежные вопросы