3

我正在使用 ADO.NET 实体框架构建一个 ASP.NET MVC 站点。我有一个包含这些实体的实体模型,由外键关联:

报告(ID、日期、标题、Report_Type_ID 等)

  • SubReport(ID, ReportText, etc.) - 与 Report 的一对一关系。
    • ReportSource(ID, Name, Description) - 与 Sub_Report 的一对多关系。
      • ReportSourceType(ID, Name, Description) - 与 ReportSource 的一对多关系。
      • 联系人(ID、姓名、地址等) - 与 Report_Source 的一对一关系。

每种类型的 SubReport 都有一个 Create.aspx 页面。post 事件方法返回一个新的 Sub_Report 实体。

之前,在我的 post 方法中,我遵循了这个过程:

  1. 从页面的字段中设置新报告实体的属性。
  2. 从页面的字段中设置 SubReport 实体的特定属性。
  3. 将 SubReport 实体的 Report 设置为 1 中创建的新 Report 实体。
  4. 给定页面提供的 ID,查找 ReportSource 并将 Sub_Report 实体的 ReportSource 设置为找到的实体。
  5. 保存更改。

这个工作流程成功了几个星期。然后上周发生了一些变化,它不再起作用了。现在,我得到了这个异常,而不是保存操作:

UpdateException:“'DIR2_5Entities.ReportSourceSet' 中的实体
参与“FK_ReportSources_ReportSourceTypes”关系。
找到 0 个相关的“ReportSourceTypes”。1 'Report_Source_Types' 是预期的。”

调试可视化工具显示以下内容:

  • SubReport 的 ReportSource 已设置并加载,其所有属性均正确。
  • Report_Source 附加了一个有效的 ReportSourceType 实体。

在 SQL Profiler 中,准备好的 SQL 语句看起来没问题。谁能指出我缺少什么明显的东西?

TIA

注意:在这种情况下,报表和子报表始终是新实体。报告实体包含许多类型的报告共有的属性,用于一般查询。子报表是特定的报表,其额外参数因类型而异。每种类型的 SubReport 实际上都有不同的实体集,但这个问题适用于所有类型,因此我使用 SubReport 作为简化示例。

4

6 回答 6

6

我意识到我迟到了,但我遇到了类似的问题,在我想出一个解决方案之前我已经破解了大约 3 个小时。我会发布代码,但它在家里 - 如果有人需要,我可以稍后再做。

以下是一些需要检查的事项:

  • 在 SaveChanges() 调用上设置断点并深入检查对象上下文。您应该会看到对上下文的添加和更改列表。当我第一次查看时,我发现它试图添加我所有的相关对象,而不仅仅是指向它们。在您的情况下,上下文可能正在尝试添加新的 Report_Source_Type。
  • 与上一点相关,但如果您正在检索报表源,请确保它是通过其实体键从数据库中检索并正确附加到上下文的。如果不是,您的上下文可能认为它是一个新项目,因此不会设置其所需的关系。

从内存中,我使用该方法检索我的引用context.GetObjectByKey,然后使用该context.Attach方法将这些对象显式附加到上下文,然后将它们分配给我的原始对象的属性。

于 2010-02-25T23:48:40.767 回答
2

我收到此错误是因为该表没有主键,它有一个 FK 引用,但没有 PK。

添加PK并更新模型后一切正常。

于 2010-09-23T21:02:55.287 回答
1

检查您的 ReportSource 是否加载了 NoTracking 选项或其 EntityState == 'Detached'。如果是这样,那是你的问题,它必须在上下文中加载。

于 2009-08-19T17:55:16.683 回答
0

如果您的数据库表彼此之间存在 1 对 1 的关系,则往往会发生这种情况。在您的示例中,reportsourceset 期望 reportsorttypes 具有它所引用的任何 id。当我的关系将来自相对表的两个主键链接在一起时,我遇到了这个问题。

于 2009-12-02T19:16:23.313 回答
0

由于在“已添加”状态下创建“幕后”的新对象实例,我遇到了同样的错误。这并不明显。

于 2010-04-06T15:01:22.197 回答
0

当我将新实体添加到上下文但忘记将新实体添加到其在对象图中的父集合中时,我收到了此错误。

例如:

Pet pet = new Pet();
context.Pets.Add(pet);
// forgot this: petOwner.Pets.Add(pet);
于 2016-10-13T00:21:32.240 回答