中に私はEFとASP.NET MVCを使用していると私は(彼らは/未チェックチェックした内容に基づいて、すなわち)、ユーザの選択に基づいてエンティティを削除しようとしている、このための私のアプローチの確認が必要です。私は「コレクションが変更された。列挙操作が実行されないことがあります。」受信していますforeachの
これを行うには、チェックボックスからフォームから渡されたIDを調べて、データベースにあるものと一致するものを探してから、新しいものを追加してから一致しないものを削除します。続き
は私がもともと持っていたコードです:
[HttpPost]
public ActionResult Edit(int id, FormCollection collection, VMinstanceRole vmodel)
{
try
{
var instancerole = db.instanceRoles.Find(id);
if (ModelState.IsValid)
{
UpdateModel<instanceRole>(instancerole, "instanceRole");
var keys = instancerole.rights.Select(c => c.Id);
foreach (var pid in vmodel.selectedId.Except(keys))
{
var right = new right { Id = pid };
db.rights.Attach(right);
instancerole.rights.Add(right);
}
foreach (var pid in keys.Except(vmodel.selectedId))
{
var right = instancerole.rights.Where(c => c.Id == pid).Single();
instancerole.rights.Remove(right);
}
db.SaveChanges();
}
// TODO: Add update logic here
return RedirectToAction("Index");
}
catch (InvalidCastException e)
{
return View();
}
}
ただし、次のエラーが「コレクションが変更された。列挙操作が実行されないことがあります。」発表されました
だから、これを試してみて、解決するために、私は別々のリストを保持し、エラーを克服するために、その後tehのリストに基づいて、それを削除することを決めた:
[HttpPost]
public ActionResult Edit(int id, FormCollection collection, VMinstanceRole vmodel)
{
try
{
var instancerole = db.instanceRoles.Find(id);
List<right> removeList = new List<right>();
if (ModelState.IsValid)
{
UpdateModel<instanceRole>(instancerole, "instanceRole");
var keys = instancerole.rights.Select(c => c.Id);
foreach (var pid in vmodel.selectedId.Except(keys))
{
var right = new right { Id = pid };
db.rights.Attach(right);
instancerole.rights.Add(right);
}
foreach (var pid in keys.Except(vmodel.selectedId))
{
var right = instancerole.rights.Where(c => c.Id == pid).Single();
removeList.Add(right);
}
foreach (var right in removeList)
{
instancerole.rights.Remove(right);
}
db.SaveChanges();
}
// TODO: Add update logic here
return RedirectToAction("Index");
}
catch (InvalidCastException e)
{
return View();
}
}
これが動作しているようですが、しかし、私はどうかわからないんだけど私は正しいことをやった。主に私は別のループをしているので。これに接近するより良い方法はありますか、それとも十分ですか?
こんにちはIlya、返信いただきありがとうございます。私はあなたが何を意味するかを見ています。これは私が持っているものよりもずっと良く感じます。ありがとう – user1012500