MVC5 ICollection <t>使用RemoveAt c#EF 6.1 </t>删除实体

时间:2014-12-01 06:35:25

标签: c# asp.net-mvc linq entity-framework

我正在将我的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);

程序继续盘旋,没有任何反应!非常感谢您的建议

1 个答案:

答案 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),因为它会指向您想要首先删除的确切实例。