我正在尝试使用现有数据库,并且我很难进行更改。我希望做一些过渡性的工作,然后成为一个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而不必在数据库中造成重大变化。
我已经考虑了一个计算列,但这只能帮助我查询。如果我试图坚持这个实体,它将会失败。
答案 0 :(得分:0)
我刚刚意识到的一个解决方法是将我的查询修改为:
myitems.Where(i => i.Parent != null && i.Parent.Id != 0)
这确实解决了它,但它确实意味着我的查询总是需要考虑数据库的这个问题,我希望所有这些都可以通过映射无缝地处理。仍然希望得到比这更好的答案。