外键不存在

时间:2015-09-21 14:27:33

标签: c# oracle linq entity-framework-6

我遇到了具有多个视图和表的遗留数据库,其中大部分都是正确的外键值。但是,其中一些“外键”不可为空,因此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.

我无法更改数据库。

1 个答案:

答案 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")]