实体框架与null或0键的关系

时间:2016-07-28 01:20:50

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

我正在尝试使用现有数据库,并且我很难进行更改。我希望做一些过渡性的工作,然后成为一个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查询所预期的那样,我得到的结果都是父正确的,而许多父对象为null。

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

我已经考虑了一个计算列,但这只能帮助我查询。如果我试图坚持这个实体,它将会失败。

1 个答案:

答案 0 :(得分:0)

我刚刚意识到的一个解决方法是将我的查询修改为:

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

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