6

我正在使用VS2012和實體設計器來生成數據庫和模型。我有一個Table1到Table1and2JoinTable到Table2的非常基本的場景。像學生,班級,學生類。你可以有許多班的許多學生。我想要一個級聯刪除。因此,如果您刪除學生,StudentClass連接表中的任何行都將被刪除以獲得該學生ID。與刪除類相同,StudentClass中的任何行都將刪除該類的id。在設計器中設置多對多關聯並設置級聯刪除選項後,當您嘗試生成數據庫時,會出現以下錯誤:如何在多對多關係中啓用Edmx Designer中的級聯刪除

錯誤132:結束'學生'關係'Model1.StudentClass'由於其重複性爲'',因此無法指定操作。不能在多重性爲''的末端指定操作。

這裏是一個小例子:

Designer

下面是創建的關聯:

enter image description here

,將所得的錯誤消息:

enter image description here

這裏是生成數據庫表的SQL代碼的一部分:

-- Creating foreign key on [Students_Id] in table 'StudentClass' 
ALTER TABLE [dbo].[StudentClass] 
ADD CONSTRAINT [FK_StudentClass_Student] 
    FOREIGN KEY ([Students_Id]) 
    REFERENCES [dbo].[Students] 
     ([Id]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION; 
-- This should be ON DELETE CASCADE ON UPDATE NO ACTION; 
GO 

-- Creating foreign key on [Classes_Id] in table 'StudentClass' 
ALTER TABLE [dbo].[StudentClass] 
ADD CONSTRAINT [FK_StudentClass_Class] 
    FOREIGN KEY ([Classes_Id]) 
    REFERENCES [dbo].[Classes] 
     ([Id]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION; 
-- This should be ON DELETE CASCADE ON UPDATE NO ACTION; 
GO 

我知道如何解決這個只需要編輯數據庫腳本,並在添加ON DELETE CASCADE選項。但是,我不想這樣做,因爲隨着項目的發展,我會多次回到設計師身邊,我不想每次都要記住這一步。

有沒有人想出瞭如何解決這個問題?

+0

級聯刪除多對多關係應該是自動的,不需要任何配置。 –

+1

是的,它應該是默認行爲,但它不是。生成表的SQL語句對於連接表具有以下內容:ON DELETE NO ACTION。這應該讀取ON DELETE CASCADE。我將完整的SQL語句添加到原始問題中。 –

回答

3

這似乎是一個edmx限制,我不明白。代碼優先完全能夠生成具有兩個級聯ON DELETE約束的聯結表,但model-first和database-first不允許在edmx中進行相同的配置。通常情況下,級聯動作在關聯的「一端」進行配置。也許這太複雜了,檢查'*'結束時級聯動作的有效性(只有當兩端'*')。

對於基於edmx模型的上下文級聯刪除,您必須加載父項其子項,然後刪除父項。

var cls = db.Classes.Include(c => c.Students).Single(c => c.Id = 1); 
db.Classes.Remove(cls); 
db.SaveChanges(); 

所執行的SQL語句表明Class是在JOIN語句Student數據庫中提取。然後分別刪除StudentClassClass

顯然,這比在數據庫中啓用級聯刪除要昂貴得多。

當然,每次修改DDL後的解決方法都是沒有吸引力的。但我認爲唯一的選擇是將StudentClass作爲模型的一部分,並在新關聯的「一端」上配置級聯刪除。或者先去代碼。

0

首先確保在數據庫端有外鍵中指定的ON DELETE CASCADE。 我有類似的問題,只需加入ON DELETE CASCADE解決它,而不是設置End1OnDeleteEnd2OnDelete屬性。

相關問題