首页 新闻 搜索 专区 学院

.NET中 EF上下文初始化的问题

0
悬赏园豆:50 [已解决问题] 解决于 2017-02-08 10:05
  public static T GetBContext()
        {
            T _logdata = CallContext.GetData("DBContext") as T;
            if (_logdata == null)
            {
                _logdata = new T();
                CallContext.SetData("DBContext", _logdata);
            }
            return _logdata;
        }
        protected static TObjectContext ObjectContext
        {
            get
            {
                // We are in a web app, use a request scope
                if (HttpContext.Current != null)
                {
                    
                    string key = "____" + typeof(TObjectContext).Name;
                    TObjectContext _objectContext = (TObjectContext)HttpContext.Current.Items[key];
                    if (_objectContext == null)
                    {
                        _objectContext = Activator.CreateInstance<TObjectContext>();
                        HttpContext.Current.Items.Add(key, _objectContext);
                    }

                    return _objectContext;
                }
                else
                {
                    //If this is not a web app then just create a datacontext
                    //which will have the same lifespan as the app itself
                    //This is only really to support unit tests and should not
                    //be used in any production code. A better way to use this
                    //code with unit tests is to mock the HttpContext
                    if (_objectContext == null)
                    {
                        _objectContext = Activator.CreateInstance<TObjectContext>();
                    }

                    return _objectContext;
                }
            }
        }

如以上的代码..两种初始化的方式,有何区别?

为什么要这么做?求解...

GuZhenYin的主页 GuZhenYin | 初学一级 | 园豆:20
提问于:2016-05-16 10:57
< >
分享
最佳答案
0

CallContext  如果有异步情况,异步的线程取到的DBContext就是新new出来的,异步数据不会传递,意味着2个线程拿到的db是都新的,没关系。

HttpContext.Current异步传递数据的。意味着2个线程拿到的是同一个DBContext对象

CallContext  可以使用 ILogicalThreadAffinative方式达到跨线程传递数据的要求

收获园豆:50
czd890 | 大侠五级 |园豆:9117 | 2016-05-19 15:55

4.6以后可以使用AsyncLocal

czd890 | 园豆:9117 (大侠五级) | 2016-05-19 15:58
其他回答(3)
0

第一个就是个绑定在T上面的单例

第二个看着像全局的单例

刘宏玺 | 园豆:14006 (专家六级) | 2016-05-16 11:10

感觉..你这解释有点牵强

支持(0) 反对(0) GuZhenYin | 园豆:20 (初学一级) | 2016-05-16 11:30

@GuZhenYin: 那我只能猜了

第一个看着像泛型,我猜每个类都是使用自己数据上下文

第二个就是全局单例,全局公用一个数据上下文

支持(0) 反对(0) 刘宏玺 | 园豆:14006 (专家六级) | 2016-05-16 11:33

@刘宏玺: 没 第一个是每个类的上下文都从CallContext中去取..有就直接用 没有就new一个

网上解释是保证线程内的上下文唯一..但是..我需要...详细的解释...

支持(0) 反对(0) GuZhenYin | 园豆:20 (初学一级) | 2016-05-16 11:46
0

2种没什么区别

只不过第一种把单例封装了

 

第二种分别处理了 请求单例和 线程单例

小眼睛老鼠 | 园豆:2774 (老鸟四级) | 2016-05-16 13:07
0

第一种只是一个单例,第二种是线程安全的。具体参考:http://www.cnblogs.com/fish-li/archive/2013/04/06/3002940.html

CNCC | 园豆:218 (菜鸟二级) | 2016-05-17 11:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册