2
  • 的SQL Server 2008R2
  • 實體框架4.x版(早期版本)

我最近換一個SQL Server 2088 R2中的視圖因此它現在包含一些LEFT OUTER JOINS而不是INNER JOINS,這會導致某些字段現在包含NULL。這留下了一個例外,即這些字段不允許爲空,因爲它們是實體鍵。SQL Server 2008中查看使用LEFT OUTER JOIN在實體框架失敗4

Please note that all files are Entity Keys

請注意,所有顯示都必須是實體按鍵,且圖片只是顯示了整個圖的一部分。

那麼我在做什麼完全錯誤?有沒有任何解決辦法,或者我有生活與它。

這裏的錯誤

錯誤213運行轉型的一個:關鍵部分: 'WorkStepId' 的 型OrderSummary無效。密鑰的所有部分必須是不可空的。

回答

3

實體鍵不允許爲NULL。實體框架必須能夠通過組合一個或多個密鑰來確定實體的唯一性。我不知道你確切的數據情況,但可能有辦法解決這個需求,但它不是很乾淨。

可能的解決方法是在您的視圖中包含邏輯T-SQL以將NULL值合併到已知的「虛擬」值。例如,使用上面的數據,您可以將兩個NULL值設置爲-1。但是:

  • 您將不得不在保存時使用某種驗證邏輯或存儲過程,以防止在執行寫操作時將不良數據持久保存到數據庫。
  • 您必須確保只有一行有兩個NULL值,可以返回WorkStepId和StepStatusId 每個Id
+0

這是我目前使用的解決方法。檢查NULL是否插入默認值。我認爲有一種方法,鍵可以爲空。但是,因爲它聽起來並不存在...... – sra

+0

鍵不能爲NULL,因爲它們用於標識唯一記錄。因爲NULL不會被認爲與其他NULL相同,所以在用於識別記錄或比較密鑰時,它們是有問題的。 –

+0

EF有可能將錯誤值推斷爲實體鍵。只需檢查實體並確保將正確的字段設置爲實體密鑰。 – Lankymart

2

EF生成視圖將所有字段都作爲關鍵字,關鍵字必須具有值。使用左連接,您將有空列。因此,您需要修改現在可以爲空的類型字段,以便它們不是鍵。我目前沒有機會在本地進行測試,所以我不能說你是否需要修改概念級別或需要進入DBML來手動調整SSDL中的密鑰。

+0

我之前嘗試過,但因爲它發生,他們需要是鑰匙。我認爲有一種方法,鍵可以爲空。但是,因爲它聽起來有沒有... – sra