2014-09-19 66 views
0

我有以下2個表DELETE語句衝突與基準約束「FK__tbl8_update__HID__55F4C372」

CREATE TABLE HOLIDAY_DATE_TABLE 
(
HID INT IDENTITY PRIMARY KEY, 
TABLE_NUMBER nchar(2) NOT NULL, 
HOLIDAY_DATE nchar(8) NOT NULL, 
FIELD_DESCRIPTION nVARchar(43) NULL, 
); 


CREATE TABLE tbl8_update_transactions 
(
TID INT IDENTITY PRIMARY KEY, 
TABLE_NUMBER nchar(2) NOT NULL, 
HOLIDAY_DATE nchar(8) NOT NULL, 
FIELD_DESCRIPTION nVARchar(43) NULL, 
HID int, 
FOREIGN KEY (HID) REFERENCES HOLIDAY_DATE_TABLE (HID) 
); 

當我執行通過我的應用程序視圖(Delete.cshtml)一刪除,我得到以下錯誤:

「DELETE語句與參考約束」FK__tbl8_update__HID__55F4C372「衝突。數據庫」BillingUI「,表」tbl8_update_transactions「,列」HID「發生衝突 該語句已終止。

基本上,當從我的視圖中對特定行執行刪除時,我希望它在HOLIDAY_DATE_TABLE和tbl8_update_transactions中都刪除相同的記錄。我讀到,我必須刪除孩子,然後刪除父母。我嘗試更改刪除的順序,但是當我這樣做時,它從tbl8_update_transactions中刪除了錯誤的記錄,因爲它正在查看其主鍵而不是外鍵。我的代碼如下,謝謝。

public ActionResult Delete(int id = 0) 
    { 
     HOLIDAY_DATE_TABLE holiday_date_table = db.HOLIDAY_DATE_TABLE.Find(id); 
     //tbl8_update_transactions tbl8_update_transaction = db.tbl8_update_transactions.Find(id); 
     if (holiday_date_table == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(holiday_date_table); 
    } 

    // 
    // POST: /Table8/Delete/5 

    [HttpPost, ActionName("Delete")] 
    public ActionResult DeleteConfirmed(int id) 
    { 
     HOLIDAY_DATE_TABLE holiday_date_table = db.HOLIDAY_DATE_TABLE.Find(id); 
     db.HOLIDAY_DATE_TABLE.Remove(holiday_date_table); 
     db.SaveChanges(); 
     tbl8_update_transactions tbl8_update_transaction = db.tbl8_update_transactions.Find(id); 
     db.tbl8_update_transactions.Remove(tbl8_update_transaction); 
     db.SaveChanges(); 
     return RedirectToAction("../Billing/HolidayDateTable"); 
    } 

更新:我想我是不太清楚。我試圖扭轉它們,即;

public ActionResult Delete(int id = 0) 
    { 
     HOLIDAY_DATE_TABLE holiday_date_table = db.HOLIDAY_DATE_TABLE.Find(id); 
     //tbl8_update_transactions tbl8_update_transaction = db.tbl8_update_transactions.Find(id); 
     if (holiday_date_table == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(holiday_date_table); 
    } 

    // 
    // POST: /Table8/Delete/5 

    [HttpPost, ActionName("Delete")] 
    public ActionResult DeleteConfirmed(int id) 
    {   
     tbl8_update_transactions tbl8_update_transaction = db.tbl8_update_transactions.Find(id); 
     db.tbl8_update_transactions.Remove(tbl8_update_transaction); 
     db.SaveChanges(); 
     HOLIDAY_DATE_TABLE holiday_date_table = db.HOLIDAY_DATE_TABLE.Find(id); 
     db.HOLIDAY_DATE_TABLE.Remove(holiday_date_table); 
     db.SaveChanges(); 
     return RedirectToAction("../Billing/HolidayDateTable"); 
    } 

,但它不工作,我收到錯誤「值不能爲空 參數名:實體」,指向 db.tbl8_update_transactions.Remove(tbl8_update_transaction);

這是因爲(至少我認爲)它從tbl8_update_transaction中刪除,它的唯一標識符TID等於HIDID_DATE_TABLE中的HID值。我需要它從tbl8_update_transaction使用其外鍵值刪除,我不知道如何在C#中。

更新2:我試圖讓它在tbl8_update_transaction的HID(外鍵)值確定的行...

public ActionResult Delete(int id = 0, int HID = 0) 
    { 
     HOLIDAY_DATE_TABLE holiday_date_table = db.HOLIDAY_DATE_TABLE.Find(id); 
     tbl8_update_transactions tbl8_update_transaction = db.tbl8_update_transactions.Find(HID); 
     if (holiday_date_table == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(holiday_date_table); 
    } 

    // 
    // POST: /Table8/Delete/5 

    [HttpPost, ActionName("Delete")] 
    public ActionResult DeleteConfirmed(int id, int HID) 
    {   
     tbl8_update_transactions tbl8_update_transaction = db.tbl8_update_transactions.Find(HID); 
     db.tbl8_update_transactions.Remove(tbl8_update_transaction); 
     db.SaveChanges(); 
     HOLIDAY_DATE_TABLE holiday_date_table = db.HOLIDAY_DATE_TABLE.Find(id); 
     db.HOLIDAY_DATE_TABLE.Remove(holiday_date_table); 
     db.SaveChanges(); 
     return RedirectToAction("../Billing/HolidayDateTable"); 
    } 

但得到以下錯誤: 參數字典包含空條目對於'BillingApp.Controllers.Table8Controller'中方法'System.Web.Mvc.ActionResult DeleteConfirmed(Int32,Int32)'的非空類型'System.Int32'的參數'HID'。可選參數必須是引用類型,可爲空類型,或者聲明爲可選參數。 參數名稱:參數

回答

1

在子表的Foreign Key約束上嘗試使用ON DELETE CASCADE

CREATE TABLE tbl8_update_transactions 
(
TID INT IDENTITY PRIMARY KEY, 
TABLE_NUMBER nchar(2) NOT NULL, 
HOLIDAY_DATE nchar(8) NOT NULL, 
FIELD_DESCRIPTION nVARchar(43) NULL, 
HID int, 
FOREIGN KEY (HID) REFERENCES HOLIDAY_DATE_TABLE (HID) ON DELETE CASCADE 
); 

ON DELETE CASCADE實現對父表中的行,當父表中的行被刪除,這將刪除相關的子表中的行級聯刪除。

+0

你可能仔細看看你的解釋。當孩子被刪除時,CASCADE DELETE不會自動刪除父母。這是相反的方式。當父母被刪除時,它會級聯刪除並刪除所有孩子。 – 2014-09-19 19:18:08

+0

謝謝,這解決了我的問題:) – Dave 2014-09-19 19:22:08

+0

謝謝@seanLange,我糾正了我的答案。 – 2014-09-22 09:09:19

4

您需要翻轉您的Remove方法。當還有孩子時,你首先刪除父母。您需要先刪除tbl8_update_transaction然後是holiday_date_table中的行。

tbl8_update_transactions tbl8_update_transaction = db.tbl8_update_transactions.Find(id); 
db.tbl8_update_transactions.Remove(tbl8_update_transaction); 
db.SaveChanges(); 
HOLIDAY_DATE_TABLE holiday_date_table = db.HOLIDAY_DATE_TABLE.Find(id); 
db.HOLIDAY_DATE_TABLE.Remove(holiday_date_table); 
db.SaveChanges(); 
+0

好吧,你是更快,並與代碼+1 :) – mybirthname 2014-09-19 17:54:41

+1

這一直保持upvoted尚未解決我的問題lol – Dave 2014-09-19 19:09:22

1

您應該刪除此ID爲外鍵的所有對象。如果您刪除此引用,它們將無效,因爲您有此例外。

相關問題