【问题标题】:Entity Framework Relation with null or 0 Key具有 null 或 0 键的实体框架关系
【发布时间】: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

这当然不会得到想要的结果,因为它返回的记录具有ParentId0。当我根据此 SQL 查询检查对象时,正如预期的那样,我得到的结果既有正确的父级,又有许多父级为空的结果。

有没有办法让 EF 将其查询中的这一列翻译成 NULLIF(0) 之类的东西?如果没有,我需要一些关于如何解决这个问题的想法,这样我就可以使用 EF 而不必在数据库中造成重大更改。

我已经考虑过计算列,但这只会帮助我进行查询。如果我尝试持久化实体,它会崩溃。

【问题讨论】:

    标签: sql entity-framework entity-framework-4 ef-fluent-api


    【解决方案1】:

    我刚刚意识到的一种解决方法是将我的查询修改为如下内容:

    myitems.Where(i => i.Parent != null && i.Parent.Id != 0)
    

    这确实解决了它,但这确实意味着我的查询将始终需要考虑数据库的这个问题,我希望所有这些都可以通过映射无缝处理。仍然希望得到比这更好的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      相关资源
      最近更新 更多