2010-03-19 118 views
15

我有一個SQLite數據庫設置,所以當我刪除一個人刪除級聯。當我手動刪除一個人(刪除引用PersonID的所有記錄)時,這工作正常。但是當我使用實體框架刪除的人,我得到一個錯誤:級聯刪除使用實體框架和System.Data.SQLite的問題

System.InvalidOperationException: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

我不明白這是爲什麼發生。我的觸發器設置爲清除所有相關對象,然後刪除它被告知要刪除的對象。

當我進入模型編輯器並檢查關係的屬性時,它不顯示OnDelete屬性的操作。爲什麼從數據庫中拉出它不正確?如果我將此值更改爲級聯,則一切正常,但我寧願不要依賴此手動更改,因爲如果從數據庫刷新我的模型並且它丟失了該怎麼辦。

下面是我的表的relivent SQL。

CREATE TABLE [SomeTable] 
(
    [SomeTableID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    [PersonID] INTEGER NOT NULL REFERENCES [Person](PersonID) ON DELETE CASCADE 
) 
CREATE TABLE [Person] 
(
    [PersonID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT 
) 

回答

24

我剛剛處理了這個確切的問題。事實證明,當我使用EF到Update model from database...選項時,它沒有正確地獲得關於刪除的「級聯」規則。

嘗試進入EF數據庫模型,單擊導致問題的關聯,然後確保End1 OnDelete(可能是End2,取決於數據庫方案)設置爲Cascade

+0

有沒有辦法解決你是否應該更新End1或End2?或者它只是試驗和錯誤? – 2011-10-28 10:55:11

+1

這取決於你的數據庫建模的方式。如果你有一對多的關係,'一個'端應該被設置爲'Cascade' – Omar 2011-10-28 14:08:28

1

聽起來像是一個供應商的bug。級聯應該從數據庫中提取。用SQL Server嘗試一下;你會看到它在那裏工作。你應該向編寫你的SQLite提供者的人報告。

+0

我可以驗證它不是(僅)SQLite提供程序錯誤。除非您刪除整個模型並重新創建,否則添加級聯不會反映到SQL Server中的模型中。疼痛。 – Andiih 2011-01-21 22:11:27

+0

@Andiih,只有當實體在沒有它們的情況下(大概是不正確的)首先被添加了。設計人員不會覆蓋您的自定義CSDL。這實際上是一個功能。 – 2011-01-22 01:57:47

+0

是的,我搞亂了數據庫設計。我沒有定製CSDL。有沒有辦法強制刷新而不刪除並重新添加整個模型? – Andiih 2011-01-22 12:00:12

4

我遇到了與SQL Server相同的問題。當我嘗試從數據庫更新模式時,它沒有選擇級聯規則。請注意,規則是​​在模型創建完成後添加的。我甚至嘗試從模型中刪除一個表格並將其添加回來。這具有相同的效果 - 沒有級聯規則。

但是,當我使用相同的確切表創建了一個全新的模型時,它採用了級聯規則。所以我的解決方案只是刪除舊的模型,並創建一個新的相同的名稱,等等。

我想是從數據庫進程更新模型有問題。

+1

我有這個問題與Sql服務器 – 2011-01-05 18:09:30

+1

我也可以確認相同的問題 – Andiih 2011-01-21 22:11:44

+0

設計師將永遠不會覆蓋現有的CSDL。因爲您通常希望保留自定義設置。在這種情況下,你不這樣做,但那不是常見的情況。 – 2011-01-22 01:58:45

0

只能使用導航屬性而不使用外鍵屬性。刪除級聯不能解決代碼中的問題,因爲您的人員對象不會被標記爲已刪除。