C# 不存在的外键

C# 不存在的外键,c#,oracle,linq,entity-framework-6,C#,Oracle,Linq,Entity Framework 6,我一直在使用一个包含多个视图和表的遗留数据库,这些视图和表的外键值大多是正确的。然而,其中一些“外键”是不可为null的,因此DBA以其无穷的智慧决定使用“0”而不是null 在本例中,如果汽车没有所有者,则汽车中的OWNERID将设置为0而不是null。 当EF尝试检索所有汽车时,只返回具有有效OwnerId的汽车,而不返回0的汽车 [Table("CAR")] public class Car { [Key, Column("CARID")] public int C

我一直在使用一个包含多个视图和表的遗留数据库,这些视图和表的外键值大多是正确的。然而,其中一些“外键”是不可为null的,因此DBA以其无穷的智慧决定使用“0”而不是null

在本例中,如果汽车没有所有者,则汽车中的OWNERID将设置为0而不是null。 当EF尝试检索所有汽车时,只返回具有有效OwnerId的汽车,而不返回0的汽车

[Table("CAR")]
public class Car {
      [Key, Column("CARID")]
      public int CarId { get;set;}
      [Column("OWNERID")]
      public int OwnerId { get;set;}

      [ForeignKey("OwnerId")]
      public virtual Owner {get;set;}
}

[Table("OWNER"]
public class Owner {
      [Key, Column("OWNERID")]
      public int Id {get;set;}
}
查询:

  var allCars = context.Cars.Include(c => c.Owner).ToList();
这只会返回具有有效所有者ID(>0)的车辆。目前,我通过两个查询来“解决”这个问题,如下所示:

  var carsWithOwner = context.Cars.Include(c => c.Owner).Where(c => c.OwnerId > 0).ToList();
  var carsWithoutOwner = context.Cars.Where(c => c.OwnerId == 0).ToList();
有什么建议吗?我想要得到所有的汽车作为回报,并且当OwnerId为0时,Owner设置为null


我无法更改数据库。

如果要允许ownerID字段为空,您必须更改EF模型

[Column("OWNERID")]
public int? OwnerId { get;set;}
此时,您的问题应该得到解决,因为如果外键可为空,则
Include
使用
LEFT JOIN
。所有
ownerId=0
的汽车应将
Owner
导航属性设置为
NULL

如果这仍然不起作用,您可以在现有表的顶部创建一个视图并查询该视图。我知道您已经声明不能更改数据库,但我猜这意味着您不能更改现有的表模式

1) 创建视图<代码>大众汽车

CREATE VIEW vw_CAR
AS 
SELECT 
    CARID, 
    CASE WHEN OWNERID = 0 THEN NULL ELSE OWNERID END AS OWNERID
FROM 
    CAR
2) 将表更改为视图

[Table("vw_CAR")]

c=>c.OwnerId>=0
你能用它吗?谢谢,这是个好主意,但问题仍然是一样的。(现在在这里尝试)。似乎它通过字段所有者ID生成内部联接。是否可以在ID为0的表所有者中添加记录?然后在代码中检查它。不幸的是,我不知道C#,但可能会创建带有OwnerAdd的左外连接车添加到a类构造函数,该构造函数将值设置为零。非常感谢。很明显,但我自己却很难弄明白。将外键值更改为nullable的解决方案在这里非常有效。