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具有定義中包含的特定「含義」。沒有什麼驚天動地的。

現在,我嘗試使用設計轉化爲實體框架這一點。在從數據庫更新模型並進行一些編輯之後,我有一個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值具有主鍵的符號,但得分值不。

在編譯時,我得到:

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

你應該接受Shan的答案。這是正確的,並保存我的培根。 – 2014-05-21 13:53:39

回答

2

您應該爲每個表中的單個身份密鑰。

ModelScore應該有一個ModelScoreId,PersonModelScore應該有一個PersonModelScoreId。表之間

參考應該是一個單一的領域。

+1

謝謝您的建議。現在,這個解決方案如何保持數據模型的完整性?每個人與每個模型不超過一個關聯,並且ModelScore必須是該模型的有效ModelScore。因此,我認爲PersonModelScore要麼必須同時具有ModelId和ModelScoreId,這是冗餘的並且需要驗證,或者只需要具有ModelScoreId,該ModelScoreId需要驗證每個模型不存在多個ModelScore。在我看來,這兩種方式似乎都不太好。 這只是實體框架的限制嗎? – Andrew 2010-05-20 19:18:24

65

很晚了你的問題,我有同樣的問題,並發現實體框架設計者已經確定了我的「ScoreId」列(相對於你PersonModelScore表)作爲主鍵列。我將ScoreId的設置更改爲false,之後都運行良好。

+0

此修復程序適用於我。一個表有兩個主鍵,當它只有一個時。 – Jesslyn 2011-05-19 21:14:12

+2

同樣在這裏。 EF決定所有非空列都應該是它們不應該是的主鍵的一部分。 – 2012-08-20 08:59:25

+7

我花了一點才弄清楚這個步驟,所以爲了清晰起見,在這裏添加。轉到您的.edmx文件,右鍵單擊背景並選擇「映射詳細信息」。單擊需要編輯.edmx窗口中的映射的表格,詳細信息應顯示在新的「映射詳細信息」窗口中。點擊F4彈出「屬性」窗口(默認位置,VS顯示屏的右下角)。單擊「映射詳細信息」中的「值/屬性」以更改顯示的屬性,並從屬性窗口中現在可以將「實體關鍵字」值設置爲「假」。 – 2014-10-04 18:54:40

0

你PersonModelScore表應該定義一個標識列,它是身份和主鍵,然後 你應該建立在PERSONID唯一密鑰,ModelId

爲錯誤3002,我有同樣的問題ALL我場已被EF

標記爲實體關鍵字
12

您可以在實體中設置單個主鍵以避免此錯誤。右鍵單擊實體中字段的標量屬性,並在主鍵較多時禁用實體關鍵字。

+0

謝謝!這對我解決,錯誤錯誤3002:從行942開始映射片段中的問題:潛在的運行時違反表[tablename]的鍵([entityname] .Id):列([entityname] .Id)被映射到概念端的EntitySet [entityset]屬性([tablename] .Id),但它們不構成EntitySet的關鍵屬性 – 2013-10-31 20:32:03

0

「轉到您的.edmx文件,右鍵單擊背景,然後選擇」映射詳細信息「。單擊需要編輯.edmx窗口中的映射的表,並在詳細信息中顯示新的映射詳細信息窗口中打開屬性選項卡(按F4鍵,彈出‘屬性’,如果不打開)點擊'你的‘映射詳細信息’價值/屬性來更改屬性中顯示,並從你的屬性窗口中,您現在可以設置'實體關鍵'值爲'假' - 克里斯帕特14年14月14日在18:54「

這對我工作 - 謝謝 這是現在我使用EF數據庫優先我的工作流程的一部分。我們有一個任務來更新數據模型。