日期:2014-05-17  浏览次数:20528 次

一个EntityFramework问题
在使用EntityFramework时,创建了DbContext,

在使用时是   1, 每个方法Using即时创建即时销毁呢;   
还是应该     2, 线程中存在唯一DbContext,每个方法直接用,不管销毁。


示例:

1:


 public System_Users GetSystemUserModel(decimal userID)
 {
            using (var objContext = GetContext())//这里的GetContext是创建DbContext的方法;
            {
                return objContext.System_Users.FirstOrDefault(c => c.UserID == userID);
            }
 }


2:


//创建线程唯一的DbContext
public static DbContext OnlyDb()
{
            
            DbContext dbcontext = CallContext.GetData("DbContext") as DbContext;
            if (dbcontext == null)  
            {
                dbcontext = new DbEntities();  //
                CallContext.SetData("DbContext", dbcontext);
            }
            return dbcontext;
}

//使用时
public DbContext db =OnlyDb();
public void  UserAdd()
{
     db.xxx;
     db.SaveChanges();
}




想问下以上哪种方法更合理,  内存?   并发?    等等各种因素...

------解决方案--------------------
需要看你实际项目需要而定啊
但EF本身会管理上下文,所以显示的声明using没一定的必要吧
------解决方案--------------------
共享DbContext的方法曾经会遇到EF的一个Bug。不过现在应该修正了。
------解决方案--------------------
友情帮顶!
------解决方案--------------------
你说的线程唯一DbContext其实就是Singleton模式,这种模式下一个地方出问题很容易导致使用同线程的其它地方的代码出现不可预料的异常,所以不建议使用,在Web应用中,DbContext的重建和销毁,最好是基于每个请求(Per Request),它对应的底层操作主要就是数据库的连接和断开,因为有连接池的存在,每次重新打开数据库连接的代价非常小,基本可以忽略。个人意见,仅供参考!
------解决方案--------------------
我在WCF中使用的HTTP协议的时候是一个请求生成一个请求完毕销毁