![](/img/trans.png)
[英]Should I dispose DbContext when using Entity Framework Core
[英]Not Using Dispose or Using() in Entity Framework
我一直在編寫一個Web應用程序並學習實體框架。 如果我做錯了事,我很好奇。 查詢時我沒有使用過dispose或使用語句。
我的存儲庫示例:
public User GetUserById(int sessionId)
{
var user = (from u in db.Users where u.Id == sessionId select u).SingleOrDefault();
return user;
}
我從中選擇的用戶表將具有與其他表關聯的外鍵。 我認為關於實體的最酷的事情是,我可以返回整個User對象(由實體構建),然后允許我在控制器中執行類似User.MyOtherTable.SomeColumn
。
問題是我依賴於此,並在我的控制器中以一種愉快的方式來獲取用戶信息以及利用來自其他表的信息。 我現在意識到,如果像下面的代碼那樣關閉該連接:
public User GetUserById(int sessionId)
{ using(db)
{
var user = (from u in db.Users where u.Id == sessionId select u).SingleOrDefault();
return user;
}
}
我的控制器不再有權訪問User.MyOtherTable.SomeColumn
因為它將為null。 我真正的問題是,在實體應用程序中使用處置對我有多重要?
我強烈建議您使用using語句,並且也不要再依賴延遲加載了。
不用選擇具有延遲加載屬性的User
對象,而是計算出所需的全部數據並將其投影到Model類,例如
public class UserWithOtherStuffModel
{
public int Id { get; set; }
public string Name { get; set; }
public string OtherStuff { get; set; }
}
然后在您的方法中:
public UserWithOtherStuffModel GetUserById(int sessionId)
{
using(db)
{
var user = (from u in db.Users
where u.Id == sessionId
select new UserWithOtherStuffModel{
Id = u.Id,
Name = u.Name,
OtherStuff = u.MyOtherTable.SomeColumn
}).SingleOrDefault();
return user;
}
}
這不僅意味着您限制了數據庫調用的次數,而且還擁有與數據庫模型無關的數據協定。 如果移動該列,則只需更新查詢以指向新的地點/名稱,視圖就可以保持不變。
因此,在處置上下文時,將無法引用延遲加載的屬性。 您需要通過釋放控制器時釋放上下文(我不記得MVC是否按請求執行此操作)或通過使用Action上的某些屬性控制上下文的生存時間來延長上下文的生存時間。
可以在此問題中找到一些有關如何解決此問題的示例,該示例與您在此處提出的要求幾乎相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.