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();

        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM