如何解决删除操作上的DBUpdateException

时间:2014-07-13 17:08:22

标签: c# wpf database database-design crud

使用VS 2012,C#,WPF

尝试创建使用数据库的简单程序。目标是在程序中实现CRUD操作。目前我在DELETE操作上有点堆叠 - 在删除期间获得异常DBUpdateException

enter image description here

内部异常

enter image description here

InnerException文本 - {"The DELETE statement conflicted with the REFERENCE constraint \"FK_SpecialityStudent\". The conflict occurred in database \"EducationDataBase\", table \"dbo.StudentSet\", column 'SpecialitySpecialityId'.\r\nThe statement has been terminated."}

据我了解,由于在另一个表(StudentSet)中使用了条目,我无法在表中删除此条目。但是当我创建我的dataBase时,我在表之间建立了1对多的relationShip,意思是

enter image description here

如果我尝试删除未在其他表中使用的SpecialitySet条目 - 一切正常。 所以关于DELETING,我建议,就像这样的关系(如图片)意味着我可以随时删除Specialty条目,即使我在另一个表中使用它。我对吗?如果没有 - 你能解释一下我更详细一些如何删除这样的条目。或者也许我在创建期间在dataBase中犯了错误。 (的问题

我用于删除的代码

private async void _deleteButton_Click(object sender, RoutedEventArgs e)
    {
        if (MessageBox.Show("Do you really want to remove speciality " + _specialityNameTextBox.Text + " ?",
            "Remove Speciality", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
        {
            using (var dbContext = new EducationDataBaseEntities())
            {
                foreach (var item in dbContext.SpecialitySet)
                {
                    if (item.Name == _specialityNameTextBox.Text
                        && item.Description == _descriptionTextBox.Text)
                    {
                        dbContext.SpecialitySet.Remove(item);
                        await dbContext.SaveChangesAsync();
                        MessageBox.Show("Speciality " + item.Description + "removed correctly",
                            "Remove speciality", MessageBoxButton.OK, MessageBoxImage.Information);
                       await LoadDataFromDB(this._specialityDataGrid);
                    }
                }
            }
        }
        else
        {
            MessageBox.Show("Operation canceled", "Canceled");
        }
    }

另外,如果我现在离开dataBase,我该如何删除已经使用过的条目?或者我不能?

1 个答案:

答案 0 :(得分:1)

你是对的。您无法从SpecialitySet中删除作为StudentSet引用的行,因为有一个名为FK_SpecialityStudent的外键设置,它强制执行参照完整性。这是外键存在的原因之一 - 保证不创建孤立记录。

http://technet.microsoft.com/en-us/library/ms175464(v=sql.105).aspx

通常,您要做的是首先从StudentSet中删除关联的行,然后从SpecialitySet中删除该行。

或者,您可以将FK_SpecialityStudent更改为级联删除。这意味着当您从SpecialitySet中删除行时,也将删除StudentSet中的所有关联行。为此,请查看此处的ON DELETE CASCADE示例:http://msdn.microsoft.com/en-us/library/ms189049.aspx