我遇到了具有多个视图和表的遗留数据库,其中大部分都是正确的外键值。但是,其中一些“外键”不可为空,因此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.
我无法更改数据库。
答案 0 :(得分:1)
如果您想允许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
2)更改表格以查看
[Table("vw_CAR")]