不存在的外键
本文关键字:不存在 | 更新日期: 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")]