2010-05-14 118 views
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数据库优先我的工作流程的一部分。我们有一个任务来更新数据模型。