我正在将我的MVC 3应用程序/ Linq-To-Sql升级到MVC 5 Entity Framework 6.1。我有一个项目列表(ID,名称等)。要更改列表,用户可以通过添加或删除表格行来添加项目或删除。使用表单集合我检查新项目并删除旧列表中存在的项目。使用以下内容:
//.....
List<int> idsToKeep = new List<int>();
for (int i = 0; i < visit.Students.Count; i++)
{
Students om = visit.Students.ElementAt(i);
if (om.StudentsId == 0)
continue;
bool itemExists = false;
int itemToDelete = 0;
foreach (int id in idsToKeep)
if (om.StudentsId == id)
{
itemExists = true;
}
else
{
itemToDelete = id;
}
if (!itemExists)
{
var entitySet = visit.Students.Where(x => x.StudentsId == 0 || idsToKeep.Contains(x.StudentsId)).ToList();
entitySet.RemoveAt(i);
// _studentRepository.RemoveStudentsType(itemToDelete);
// visit.Students.RemoveAt(i);
i--;
}
}
在Linq-to-Sql中,我使用了:
visit.Students.RemoveAt(i);
无法解析RemoveAt,因为列表是ICollection。所以我用过:
var entitySet = visit.Students.Where(x => x.StudentsId == 0 || idsToKeep.Contains(x.StudentsId)).ToList();
entitySet.RemoveAt(i);
程序继续盘旋,没有任何反应!非常感谢您的建议
答案 0 :(得分:1)
您正在从Entity Framework跟踪的集合的副本中删除实体。果然,您的上下文没有注意到这种变化,因为它完全不知道副本:它只记录原始ICollection<T>
中的变化(即visit.Students
)。
您应该考虑首先在正确的索引处找到具体实体 - 可能使用LINQ&#39; ElementAt`,如下所示:
var entityAtIndex = visit.Students.ElementAt(i);
visit.Students.Remove(entityAtIndex);
或者,更好的是,只需使用visit.Students.Remove(om)
,因为它会指向您想要首先删除的确切实例。