2015-09-21 27 views
0

我被遺留在具有多個視圖和表的遺留數據庫中,並且大部分是正確的外鍵值。然而,這些「外鍵」中的一些不是可空的,所以DBA以他無窮的智慧決定使用「0」而不是空值。不存在的外鍵

在此示例中,如果汽車沒有所有者,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(); 

任何指針或建議做什麼?我希望獲得所有車輛的回報,並將Owner設置爲null,其中OwnerId爲0.

我無法更改數據庫。

+0

'C => c.OwnerId> = 0'你能不能用呢? –

+0

謝謝,這是一個好主意,但問題依然存在。 (現在試過)。 – Larsbj

+0

似乎它產生內部加入由領域ownerid。可能你可以在表中添加記錄ID = 0的所有者?並在代碼中稍後檢查。不幸的是,我不知道C#,但可能可以創建左外部連接車輛與所有者 –

回答

1

如果您不想讓所有者可以爲空,您必須改變您的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")] 
+0

非常感謝。如此明顯,但我自己卻很難弄清楚。將外鍵值更改爲可爲空的解決方案在這裏很有用。 – Larsbj