1. 程式人生 > >EF Core中如何取消跟蹤DbContext中所有被跟蹤的實體

EF Core中如何取消跟蹤DbContext中所有被跟蹤的實體

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

        }
    }
}