【发布时间】:2016-07-28 12:34:18
【问题描述】:
我正在尝试使用现有数据库,但我很难做出更改。我希望做一些过渡性的工作并成为 ORM,但是我遇到了一个问题。
我正在使用 EF Fluent API(更接近 NHibernate 的做事方式),并且我们在数据库中有一个可为空的列 ParentId。我为此创建了一个HasOptional 关系并且它有效:
HasOptional(x => x.Parent).WithMany().Map(m => m.MapKey("ParentId"));
这个特定的列在这个列中似乎有很多 0(他们不使用外键),我可能无法添加 FK 约束,因为我会破坏他们的其他应用程序(因为我需要去虽然并更改/删除没有 FK 匹配的所有内容)。 EF 确实很好地处理了这个问题,对于这些没有与 id 0 匹配的父项的记录,EF 为空。但是,如果我尝试使用这样的 Linq 查询,这就会失败:
myitems.Where(i => Parent != null)
选择Parent != null 所在的所有内容。这会翻译这种类型的 SQL 查询
WHERE ParentId = null
这当然不会得到想要的结果,因为它返回的记录具有ParentId 或0。当我根据此 SQL 查询检查对象时,正如预期的那样,我得到的结果既有正确的父级,又有许多父级为空的结果。
有没有办法让 EF 将其查询中的这一列翻译成 NULLIF(0) 之类的东西?如果没有,我需要一些关于如何解决这个问题的想法,这样我就可以使用 EF 而不必在数据库中造成重大更改。
我已经考虑过计算列,但这只会帮助我进行查询。如果我尝试持久化实体,它会崩溃。
【问题讨论】:
标签: sql entity-framework entity-framework-4 ef-fluent-api