为什么这段代码不起作用?它插入一个对象但不删除它
public int Toggle(RequestArchive RequestArchiveObj)
{
var ra = DataContext.RequestArchives.Where(rec => rec.UserId == RequestArchiveObj.UserId && rec.RequestId == RequestArchiveObj.RequestId);
if(ra.Count() > 0)
{
foreach (var item in ra)
{
DataContext.DeleteObject(item);
}
}
else
{
DataContext.AddToRequestArchives(RequestArchiveObj);
}
DataContext.SaveChanges();
return RequestArchiveObj.Id;
}
答案 0 :(得分:1)
您的代码存在潜在的危险问题,您的问题可能与此有关:
如果循环遍历查询对象(DataContext.RequestArchives.Where()
返回的对象)而不执行它,则您将为循环中的每个项目进行数据库往返。这称为N+1 selects problem。
您可以使用ToList()
方法缓解此问题:
var ra = DataContext.RequestArchives
.Where(rec =>
rec.UserId == RequestArchiveObj.UserId &&
rec.RequestId == RequestArchiveObj.RequestId)
.ToList(); // this executes the query
// ...
foreach (var item in ra) // without ToList() this will query every item by itself
{
DataContext.DeleteObject(item); // and this might collide with the query
}
我不确定这一点,但可能会出现删除问题,因为您尝试删除对象,同时仍然通过foreach
循环查询它们。如果是这种情况,一旦您按照上面的建议使用ToList()
,它就应该有效。