如何消除错误3002?

And*_*rew 41 linq-to-entities entity-framework .net-3.5 sql-server-2008

假设我在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))
Run Code Online (Sandbox Code Playgroud)

这里的想法是每个人每个模型可能只有一个ModelScore,但每个Person可能有任意数量的已定义模型的分数.据我所知,这个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).

我在设计器或其他方面做错了什么,如何修复错误?

非常感谢!

Sha*_*rde 65

很晚了你的问题,我有同样的问题,并发现实体框架设计者已经确定了我的"ScoreId"列(相对于你PersonModelScore表)作为主键列.我将ScoreId的设置更改为false,之后一切运行良好.

  • 我花了一些时间来弄清楚这个步骤,所以为了清楚起见在这里添加.转到.edmx文件,右键单击背景并选择"映射详细信息".单击需要编辑.edmx窗口中映射的表,详细信息应显示在新的"映射详细信息"窗口中.按F4打开"属性"窗口(默认位置,VS显示屏的右下角).单击"映射详细信息"中的"值/属性"以更改显示的属性,现在可以从"属性"窗口将"实体键"值设置为"False". (7认同)
  • 同样在这里.EF决定所有非空列应该是它们不应该是主键的一部分. (2认同)

小智 13

你可以为了避免这种error.Right点击字段的实体的标量属性和禁用实体键,如果有许多主键设置在单一实体的主键.


Shi*_*iji 2

您应该为每个表创建一个身份键。

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

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