11

私は以下を持っており、レコードを削除するのではなく、レコードをループしてから一度に1つずつ削除するより効率的な方法を探しています(Dbsetを使用していることに注意してください)。

     var wcd = dbContext.ProgramDetails.Where(p => p.Id == Id);

     foreach (var wc in wcd.ToList())
     {
        dbContext.ProgramDetails.Remove(wc);
     }

     dbContext.SaveChanges();

また、次のようなレコードが1つある場合も言います。

    var pg = dbContext.Program.Where(p => p.Id == Id && Name == FName);

この1つのレコードを削除する最良の方法は何ですか?

次のことを試しましたが、エラーが発生しました。

    var pg = dbContext.Program.Where(p => p.Id == Id && Name == FName);
    dbContext.Program.Remove(wc);

次に、上記で示したように、1つのレコードだけを削除するためのforeachを実行しましたが、これは1つのレコードだけでは最も効率的ではありません。

4

1 に答える 1

13

EF7 の更新:

using (var db = new BloggingContext())
{
  var blog = db.Blogs.First(p => p.Id == Id);
  db.Remove(blog);
  db.SaveChanges();
}

2015 年 5 月の更新: msdn例の更新されたドキュメントを確認してください。EF6 でエンティティを削除するコード例:

 public async Task<ActionResult> Delete(Department department) 
 { 
        try 
        { 
            db.Entry(department).State = EntityState.Deleted; 
            await db.SaveChangesAsync(); 
            return RedirectToAction("Index"); 
        } 
        catch (DbUpdateConcurrencyException) 
        { 
            return RedirectToAction("Delete", new { concurrencyError = true, id = department.DepartmentID }); 
        } 
        catch (DataException /* dex */) 
        { 
            //Log the error (uncomment dex variable name after DataException and add a line here to write a log. 
            ModelState.AddModelError(string.Empty, "Unable to delete. Try again, and if the problem persists contact your system administrator."); 
            return View(department); 
        } 
 } 

ID を知っていてエンティティをロードしていない場合の最も効果的な方法は、偽のエンティティを作成して削除することです。

var p = new Program  { Id = myId } 
dbContext.Program.Remove(p)

しかし、同じ ID を持つ複数のレコードが実際にあり、name正しいレコードを選択するためにフィールドも使用する必要がある場合、これは機能しません。

また、最後の例は

var pg = dbContext.Program.First(p => p.Id == Id && p.Name == FName);
dbContext.Program.Remove(pg);
于 2012-10-11T02:04:40.970 に答える