private void btnDel_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Are you sure to Delete this Record?", "Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Stop) == DialogResult.Yes)
{
using (SFCDataContext SFC = new SFCDataContext())
{
var countRec = SFC.Systems_MonitoringMeasurementHeaders.Where(t => t.DocNO == DocNum.Text && t.DetailsDocNum == clsVariable.GetDocNumRecord).Count();
if (countRec > 0)
{
Systems_MonitoringMeasurementHeader Table = SFC.Systems_MonitoringMeasurementHeaders.FirstOrDefault(r => r.DocNO == DocNum.Text && r.DetailsDocNum == clsVariable.GetDocNumRecord);
SFC.Systems_MonitoringMeasurementHeaders.DeleteOnSubmit(Table);
}
var countRecDetails = SFC.Systems_MonitoringMeasurementDetails.Where(y => y.DocNO == DocNum.Text && y.DetailsDocNum == clsVariable.GetDocNumRecord).Count(); <-- Starts here..
if (countRecDetails > 0)
{
for (int i = 0; i < countRecDetails; i++)
{
Systems_MonitoringMeasurementDetail TableDetails = SFC.Systems_MonitoringMeasurementDetails.FirstOrDefault(w => w.DocNO == DocNum.Text && w.DetailsDocNum == clsVariable.GetDocNumRecord);
SFC.Systems_MonitoringMeasurementDetails.DeleteOnSubmit(TableDetails);
}
} <-- Til here
SFC.SubmitChanges();
SFC.Connection.Close();
gfunc.setMessageBox("Delete Successful!", 2);
ClearFields(2);
btnSetLock(true, false, true, false, false, false, false, true);
DocNum.Enabled = true;
DocNum.Focus();
}
}
}
问题是在删除详细记录时它确实执行了删除但它只删除了一行。而不是5或更多..它只需要第一个条目。我通过调试中参考找到的记录的计数来制作一个for循环语句,它显示了记录ex的确切计数。 5所以它循环删除记录5次,但只删除第一个条目,其余没有。为什么?请帮忙。
- 更新 -
if (MessageBox.Show("Are you sure to Delete this Record?", "Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Stop) == DialogResult.Yes)
{
using (SFCDataContext SFC = new SFCDataContext())
{
var countRec = SFC.Systems_MonitoringMeasurementHeaders.Where(t => t.DocNO == DocNum.Text && t.DetailsDocNum == clsVariable.GetDocNumRecord);
if (countRec.Count() > 0)
{
SFC.Systems_MonitoringMeasurementHeaders.DeleteAllOnSubmit(countRec.ToList());
}
var countRecDetails = SFC.Systems_MonitoringMeasurementDetails.Where(y => y.DocNO == DocNum.Text && y.DetailsDocNum == clsVariable.GetDocNumRecord);
if (countRecDetails.Count() > 0)
{
SFC.Systems_MonitoringMeasurementDetails.DeleteAllOnSubmit(countRecDetails.ToList());
}
SFC.SubmitChanges();
SFC.Connection.Close();
}
gfunc.setMessageBox("Delete Successful!", 2);
ClearFields(2);
btnSetLock(true, false, true, false, false, false, false, true);
DocNum.Enabled = true;
DocNum.Focus();
}
它有效,但我不知道是否可以。
答案 0 :(得分:4)
您的解决方案无效,因为您要查询实体是否在循环中删除,但您不会在每个步骤上提交更改。因此,你得到完全相同的第一行5次(因为数据库在这里没有改变)。您将其标记为删除5次。然后在提交期间,您只删除此行。
您可以使用单个查询,而不是进行两次查询(一次用于检查实体是否存在,以及其他需要加载的实体):
var header = SFC.Systems_MonitoringMeasurementHeaders
.FirstOrDefault(h => h.DocNO == DocNum.Text &&
h.DetailsDocNum == clsVariable.GetDocNumRecord);
if (header != null)
SFC.Systems_MonitoringMeasurementHeaders.DeleteOnSubmit(header);
与多个实体相同(此处您有6个查询而不是一个)
var details = SFC.Systems_MonitoringMeasurementDetails
.Where(d => d.DocNO == DocNum.Text &&
d.DetailsDocNum == clsVariable.GetDocNumRecord);
foreach(var detail in details)
SFC.Systems_MonitoringMeasurementDetails.DeleteOnSubmit(detail);
SFC.SubmitChanges();
请记住 - 在您致电SubmitChanges()
之前,数据库中未更新任何内容。如果在不更改数据库的情况下多次执行相同的查询,则会返回相同的数据。
答案 1 :(得分:2)
我猜你没有意识到你要删除第一行5次。
建议使用DeleteAllOnSubmit
方法删除多行。
var tableDetails = SFC.Systems_MonitoringMeasurementDetails.Where(
y => y.DocNO == DocNum.Text &&
y.DetailsDocNum == clsVariable.GetDocNumRecord);
if(tableDetails.Any())
{
SFC.Systems_MonitoringMeasurementDetails.DeleteAllOnSubmit(tableDetails);
}