EF Core中如何取消跟蹤DbContext中所有被跟蹤的實體
阿新 • • 發佈:2019-01-04
首先定義一個DbContext的擴充套件類DbContextDetachAllExtension,其中包含一個DbContext的擴充套件方法DetachAll,用來取消跟蹤DbContext中所有被跟蹤的實體:
using Microsoft.EntityFrameworkCore; using System.Linq; namespace DbContextUtils { /// <summary> /// DbContext的擴充套件類 /// </summary> public static class DbContextDetachAllExtension {/// <summary> /// 取消跟蹤DbContext中所有被跟蹤的實體 /// </summary> public static void DetachAll(this DbContext dbContext) { //迴圈遍歷DbContext中所有被跟蹤的實體 while (true) { //每次迴圈獲取DbContext中一個被跟蹤的實體 var currentEntry = dbContext.ChangeTracker.Entries().FirstOrDefault();//currentEntry不為null,就將其State設定為EntityState.Detached,即取消跟蹤該實體 if (currentEntry != null) { //設定實體State為EntityState.Detached,取消跟蹤該實體,之後dbContext.ChangeTracker.Entries().Count()的值會減1 currentEntry.State = EntityState.Detached; }//currentEntry為null,表示DbContext中已經沒有被跟蹤的實體了,則跳出迴圈 else { break; } } } } }
其用法如下:
using ConsoleApp1.Entities; using DbContextUtils; using System; using System.Linq; namespace ConsoleApp1 { class Program { static void Main(string[] args) { using (DemoContext dbContext = new DemoContext()) { var Persons = dbContext.Person.ToList(); dbContext.DetachAll(); } Console.WriteLine("Press key.."); Console.ReadKey(); } } }