[英]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");
}
謝謝。
在您第二次在存儲庫上調用方法時,將對其進行處理。 時間線是這樣的:
GetUserByEmailId
, _instance
為null,因此將其初始化 GetUserByEmailId
已完成,並且已處置上下文。 但是對象仍然存在於_instance
字段中 UpdateUser
, _instance
不為null,因此using
返回舊上下文 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.