我有以下2个表
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语句与REFERENCE约束冲突”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等于HOLIDAY_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'的空条目。可选参数必须是引用类型,可空类型,或者声明为可选参数。 参数名称:参数
答案 0 :(得分:4)
你需要翻转你的删除方法。当您还有孩子时,您将首先删除父母。您需要先从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();
答案 1 :(得分:1)
您应该删除此ID为外键的所有对象。如果删除此引用,它们将无效,因为您有此异常。
答案 2 :(得分:1)
尝试在子表的ON DELETE CASCADE
约束中使用Foreign Key
。
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
在父表的行上实现级联删除,当父表的行被删除时,这些行将删除关联的子表的行。