【问题标题】:How do I eliminate Error 3002?如何消除错误 3002?
【发布时间】:2011-02-19 15:00:41
【问题描述】:

假设我在 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 具有特定的“含义”,它包含在定义中。没有什么惊天动地的。

现在,我尝试使用设计器将其转换为实体框架。从数据库更新模型并进行一些编辑后,我有一个 Person 对象、一个 Model 对象和一个 ModelScore 对象。作为连接表的 PersonModelScore 不是一个对象,而是作为与其他名称的关联包含在内(比如说 ModelScorePersonAssociation)。关联的映射细节如下:

- 协会 - 映射到 PersonModelScore - 模型分数 ModelId : Int32 ModelId : int 分数:Int32 分数:int - 人 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).

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

非常感谢!

【问题讨论】:

  • 你应该接受单的回答。这是正确的,并保存了我的培根。

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


【解决方案1】:

您的问题很晚,我遇到了同样的问题,发现实体框架设计人员已将我的“ScoreId”列(相对于您的 PersonModelScore 表)确定为主键列。我将 ScoreId 的设置更改为 false,之后一切正常。

【讨论】:

  • 这个修复对我有用。一个表应该只有一个主键,但它有两个主键。
  • 这里也一样。 EF 决定所有非空列都应该是它们不应该是主键的一部分。
  • 我花了一点时间才弄清楚这个步骤,所以为了清楚起见,在此处添加。转到您的 .edmx 文件,右键单击背景并选择“映射详细信息”。单击您需要在 .edmx 窗口中编辑映射的表,详细信息应显示在新的“映射详细信息”窗口中。按 F4 调出“属性”窗口(默认位置,VS 显示屏的右下角)。单击“映射详细信息”中的“值/属性”以更改显示的属性,现在可以在“属性”窗口中将“实体键”值设置为“假”。
  • 六年后,这个答案仍然救了我。 EF 决定需要额外的 3 列作为主键的一部分。
  • 迟到总比没有好!
【解决方案2】:

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

【讨论】:

  • 谢谢!这为我解决了,错误 1 ​​错误 3002:从第 942 行开始映射片段时出现问题:表 [tablename] 的键 ([entityname].Id) 的潜在运行时违规:列 ([entityname].Id) 映射到 EntitySet [entityset] 属性 ([tablename].Id) 在概念方面,但它们不构成 EntitySet 的关键属性
【解决方案3】:

您应该为每个表创建一个标识键。

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

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

【讨论】:

  • 感谢您的建议。现在,这个解决方案如何仍然保持数据模型的完整性?每个人与每个模型不超过一个相关联,并且 ModelScore 必须是该模型的有效 ModelScore。因此,我认为 PersonModelScore 要么必须同时具有 ModelId 和 ModelScoreId,这是多余的并且需要验证,要么只有 ModelScoreId,这需要验证每个人的每个模型没有多个 ModelScore。在我看来,这两种方法似乎都不是很好。那么这只是实体框架的限制吗?
【解决方案4】:

您的 PersonModelScore 表应该定义一个作为身份和主键的 Id 列,然后 您应该在 PersonId、ModelId 上创建一个唯一键

至于错误 3002,我遇到了同样的问题 ALL 我的字段已被 EF 标记为实体键

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      相关资源
      最近更新 更多