簡體   English   中英

使用“ using語句”時已丟棄dbcontext

[英]Dbcontext has been disposed when using “using Statement”

錯誤信息:

由於已丟棄dbcontext,因此無法完成該操作。

有人可以解釋為什么在執行更新時我的DbContext被丟棄的原因和位置嗎?

上下文文件:

using System.Data.Entity;

namespace OnlineTest
{
   internal class OnlineTestContext : DbContext
   {
       private OnlineTestContext() : base("name=OnlineTest")
       {
       }

       private static OnlineTestContext _instance;

       public static OnlineTestContext GetInstance
       {
           get
           {
                if (_instance == null)
                {
                    _instance = new OnlineTestContext();
                }
                return _instance;
           }
       }

       public DbSet<User> Users { get; set; }
   }
}

商業邏輯:

    public int UpdateUser(User user)
    {
        user.ModifiedOn = DateTime.Now;

        using (var context = OnlineTestContext.GetInstance)
        {
            context.Entry(user).State = EntityState.Modified;
            return context.SaveChanges();
        }
    }

    public User GetUserByEmailId(string emailId)
    {
        using (var context = OnlineTestContext.GetInstance)
        {
            return context.Users.First(u => u.EmailId == emailId);
        }
    }

單元測試:

    [TestMethod]
    public void UpdateUserUnitTest()
    {
        User user = onlineTestBusinessLogic.GetUserByEmailId("test@test");
        user.PhoneNumber = "+91 1234567890";
        int changes = onlineTestBusinessLogic.UpdateUser(user);
        User Modifieduser = onlineTestBusinessLogic.GetUserByEmailId("test@test");
        Assert.AreEqual(Modifieduser.PhoneNumber, "+91 0987654321");
    }

謝謝。

在您第二次在存儲庫上調用方法時,將對其進行處理。 時間線是這樣的:

  1. GetUserByEmailId_instance為null,因此將其初始化
  2. GetUserByEmailId已完成,並且已處置上下文。 但是對象仍然存在於_instance字段中
  3. 調用UpdateUser_instance不為null,因此using返回舊上下文
  4. context.SaveChanges被調用,但是由於上下文的這個對象已經被處理,所以拋出異常

通常,避免這樣緩存數據庫上下文是一個好主意。 基本的經驗法則是“每個工作單元一個上下文對象”。 您可以在此線程中找到更多有關其原因的信息(由Jon Skeet主演!)。

using關鍵字是您專門說的:“當示波器關閉時,在我傳入的對象上調用.Dispose()”。 這不是您想要的,因為您要反復使用該對象。

刪除使用方法,您將停止獲取此問題。 例如

var context = OnlineTestContext.GetInstance;
context.Entry(user).State = EntityState.Modified;
return context.SaveChanges();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM