CallContext 是類似於方法調用的線程本地存儲區的專用集合對象,並提供對每個邏輯執行線程都唯一的數據槽。數據槽不在其他邏輯線程上的調用上下文之間共享。當 CallContext 沿執行代碼路徑往返傳播並且由該路徑中的各個對象檢查時,可將對象添加到其中。
public class DbContextFactory { public static DbContext CreateDbContext() { DbContext dbContext = (DbContext)CallContext.GetData("dbContext"); if(dbContext == null) { dbContext = new RolePermissionEntities(); CallContext.SetData("dbContext",dbContext); } return dbContext; } }
不能每次使用EF上下文都通過new來創建對象,因為在不同層中使用EF上下文時就不在是同一個上下文對象了。我們可能會考慮使用單例模式,但是不能通過單例模式來解決EF上下文對象的問題,因為如果使用單例模式,那么大家都共用一個EF上下文對象一直不能釋放,一旦釋放,其他正在使用的用戶用不了了。可以考慮一次請求中使用一個EF上下文對象。這樣既不影響其他用戶的操作,也減少了數據庫連接,即線程內唯一對象,因為一個請求就是一個線程。