如何消除错误3002?

时间:2010-05-14 16:41:42

标签: entity-framework sql-server-2008 .net-3.5 linq-to-entities

假设我在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值具有主键符号,但分数值不具有。

编译完成后,我得到:

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 个答案:

答案 0 :(得分:65)

你的问题已经很晚了,我遇到了同样的问题,发现实体框架设计师已将我的“ScoreId”列(相对于你的PersonModelScore表)标识为主键列。我将ScoreId的设置更改为false,之后一切运行良好。

答案 1 :(得分:12)

您可以在实体中设置单个主键以避免此错误。右键单击实体中字段的标量属性,如果有许多主键,则禁用实体键。

答案 2 :(得分:2)

您应该为每个表创建一个Identity密钥。

ModelScore应该有ModelScoreId,PersonModelScore应该有PersonModelScoreId。

表之间的引用应该是单个字段。

答案 3 :(得分:0)

您的PersonModelScore表应定义身份和主键的Id列 你应该在PersonId,ModelId

上创建一个唯一的键

对于错误3002,我有同样的问题所有我的字段已被EF标记为实体密钥

答案 4 :(得分:0)

“转到.edmx文件,右键单击背景并选择'映射详细信息'。单击需要编辑.edmx窗口中映射的表,详细信息应显示在新的'映射详细信息中'窗口。打开属性选项卡(如果未打开,按F4调出'属性')单击“映射详细信息”中的“值/属性”以更改显示的属性,然后从“属性”窗口中设置'实体关键'值为'错'。 - Chris Paton于2014年10月4日18:54“

这对我有用 - 谢谢 现在,使用EF Database First时,这是我工作流程的一部分。我们还有一项任务是更新数据模型。