在一次請求中,即一個線程內,若是用到EF數據上下文對象,就創建一個,那么會造成數據混亂,每次創建的對象執行相應的數據庫操作,此同時,其他的EF對象內獲得的數據可能已經是“過期”的了。即這個數據已經變動過。這就是數據混亂,為了解決這個問題,關鍵就是對象的創建問題。
這里首先想到單例模式,不過在這里,不適合用,原因是使用單例模式,會使EF對象得不到及時的資源釋放。
第二種方式即保證在線程內對象唯一,如何保證呢,通過微軟ASP機制的HttpContext對象,這個對象在線程中是唯一的,所以我們在HttpContext中創建或者說添加一個對象,即把我們要創建的EF數據上下文對象添加到HttpContext中。
如何添加呢,可以在工具類(Common.cs)中添加這個個方法去創建
/// <summary> /// 用來創建EF上下文對象,且保證線程內唯一。 /// </summary> public class DbContextFactory { //DbContext在System.Data.Entity;中,不過這里直接只引用這一個不行,還有EF其他的一些NameSpace所以直接添加一個實體模型,所有引用都進來了,然后再把模型刪了 public static DbContext CreateDbContext() { DbContext dbContext = (DbContext)CallContext.GetData("dbContext"); if (dbContext == null) { dbContext = new HuaGongWebEntities();//Model中的實體模型的EF上下文實例 CallContext.SetData("dbContext", dbContext); } return dbContext; } }
