DELETE语句与REFERENCE约束冲突" FK__tbl8_update__HID__55F4C372"

时间:2014-09-19 17:46:55

标签: c# sql sql-server linq

我有以下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'的空条目。可选参数必须是引用类型,可空类型,或者声明为可选参数。 参数名称:参数

3 个答案:

答案 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在父表的行上实现级联删除,当父表的行被删除时,这些行将删除关联的子表的行。