我有以下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'。可選參數必須是引用類型,可爲空類型,或者聲明爲可選參數。 參數名稱:參數
你可能仔細看看你的解釋。當孩子被刪除時,CASCADE DELETE不會自動刪除父母。這是相反的方式。當父母被刪除時,它會級聯刪除並刪除所有孩子。 – 2014-09-19 19:18:08
謝謝,這解決了我的問題:) – Dave 2014-09-19 19:22:08
謝謝@seanLange,我糾正了我的答案。 – 2014-09-22 09:09:19