首先定義一個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(); } } }