我有两个表与1对1 .. *的关系(意味着在' Status'表中始终会有特定ID的记录。
|Area| | Status |
------ -------------------
|[Key] ID | ----> |[Key] ID |
| Name| |[Key] Start Date |
| End Date |
我在数据层中建立了如下关系。
区
HasMany(s => s.Statuses)
.WithRequired()
.HasForeignKey(s => s.Id);
状态
HasRequired(a => a.Area)
.WithMany(s => s.Statuses)
.HasForeignKey(s => s.Id);
我有一个通用的' AllIncluding'我用来收集相关数据的方法。在调试器中,我可以查看查询并复制/粘贴到我的Oracle数据库并执行。它可以正常工作,并且会返回适当的行数 问题是在调试器中执行后,我浏览记录集并找到一组完全不同的数据(简化集)。
我的想法是,因为我按照图中所述定义了键。我可以创建有关... the upper bound of the multiplicity of the Dependent Role must be '1'
的错误,并通过简单地修改Status表上的键来修改调试器中返回的记录集。
这似乎表明记录关系试图删除Status表中的重复项以创建Join?我试图通过执行group by trunc(start_date)
或其他类似查询在Oracle中重新创建此内容,但无法查看确切的行返回结果。
它只是证实了我怀疑Fluent API中定义的映射和关系必定是错误的,但我不确定如何正确表示它。
最终,我只是想创建一个1 - > Fluent API中的1 .. *关系。
谢谢!
答案 0 :(得分:1)
它只是证实了我怀疑Fluent API中定义的映射和关系必须是错误的
在映射与Fluent API的关系时要非常小心。具体而言,使用的With
方法重载必须完全匹配导航属性的存在/不存在。 WithRequired()
和.WithRequired(a => a.Statuses)
完全不同。如果没有导航属性,请使用前者,否则使用后者。在您的情况下,您错误地使用了无参数过载。
始终在一个位置配置关系。这种关系是涉及两个实体的一件事 - 不需要在两个地方复制它,更重要的是,它容易出错。目前您有两个定义,一个是正确的(Status
},另一个是不正确的(Area
)。净效应是EF认为它们是两种不同的关系,这反过来导致不正确的结果。
因此,请从Area
中删除代码,然后将代码保留在Status
中:
HasRequired(s => s.Area)
.WithMany(a => a.Statuses)
.HasForeignKey(s => s.Id);
或从Status
中删除代码,并在Area
中使用以下内容:
HasMany(a => a.Statuses)
.WithRequired(s => s.Area)
.HasForeignKey(s => s.Id);