使用VS 2012,C#,WPF
尝试创建使用数据库的简单程序。目标是在程序中实现CRUD操作。目前我在DELETE操作上有点堆叠 - 在删除期间获得异常DBUpdateException
内部异常
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,意思是
如果我尝试删除未在其他表中使用的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,我该如何删除已经使用过的条目?或者我不能?
答案 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