不存在的外键

本文关键字:不存在 | 更新日期: 2023-09-27 18:13:41

我被一个具有多个视图和表的遗留数据库所困,其中大多数外键值是正确的。然而,其中一些"外键"是不可空的,因此DBA以其无限的智慧决定使用"0"而不是null。

在本例中,如果汽车没有所有者,CAR中的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();

这只返回具有有效OwnerId(>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();

有什么建议吗?我想得到所有的汽车作为回报,并与所有者设置为null,其中OwnerId为0。

我不能更改数据库

不存在的外键

如果你想让ownerID字段为空,你必须改变你的EF模型。

[Column("OWNERID")]
public int? OwnerId { get;set;}
在这一点上,您的问题应该解决,因为Include使用LEFT JOIN,如果外键是空的。所有具有ownerId = 0的汽车都应该将Owner导航属性设置为NULL

如果这仍然不起作用,您可以在现有表上创建一个视图并查询它。我知道你说过你不能改变数据库,但我猜这意味着你不能改变现有的表模式。

1)创建视图vw_CAR

CREATE VIEW vw_CAR
AS 
SELECT 
    CARID, 
    CASE WHEN OWNERID = 0 THEN NULL ELSE OWNERID END AS OWNERID
FROM 
    CAR

[Table("vw_CAR")]