"一个实体对象不能由多个IEntityChangeTracker实例引用" 推荐解决方案

 PS:网上所说的以下可以解决该问题,但是不是推荐的解决方案。

摘录 csdn:

问题:把一个对象更新完其中一个字段后,更新进数据库中,报这个错。

解决方法:重新从数据库中取出这个对象,再更新要改的字段,保存进数据库就可以了。
 

摘录 cnblog:
http://www.cnblogs.com/oneword/archive/2012/03/18/2404967.html ;

摘录 csdn 
http://blog.csdn.net/sb1ue/article/details/7024888 ;

以上几种方法,都是将原有的Entity实体对象重新从数据库中查找出来,然后进行操作;但是这样的方法是不推荐使用的。引起这一问题的原因是"当前线程中存在多个DBContext上下文对象",可能是你的DAL层中每进行一次操作都new了一次DBContext对象。解决的办法就是使用单例模式,保证线程内只有一个DBContext对象。

推荐的解决方案一-线程内唯一: 


 在DAL层中,建立工厂类

    public static class DBContextFactory
    {
        /// 获取线程内唯一的dbContext对象        public static DbContext GetDbContext()
        {
            // 首先先线程上下文中查看是否有已存在的DBContext
            // 如果有那么直接返回这个,如果没有就新建 
            DbContext DB = CallContext.GetData("DBContext") as DbContext;
            if (DB == null)
            {
                DB = new DbContext ();
                CallContext.SetData("DBContext", DB);
            }
            return DB;
        }
    } 

推荐的解决方案二-单次请求内唯一: 

如果你是ASP.NET项目,那么我推荐你这样做,让DbContext变为HTTP单次请求内唯一,因为现在异步化趋势越来越明显,如果你得ASP.NET项目是异步,那么线程唯一并不能保证能解决该问题。

        /// <summary>
        /// 从Http上下文中获取EF容器
        /// </summary>
        /// <returns></returns>
        public static DbContext GetDBContext()
        {
            var context = HttpContext.Current.Items[nameof(DbContext)] as DbContext;
            if (context == null)
            {
                context = new DbContext();
                HttpContext.Current.Items[nameof(DbContext)] = context;
            }

            return context as DbContext;
        }

后在需要用到DBContext的地方调用 DBContextFactory.GetDbContext()方法即可解决。

CSDN很奇怪,下面这一截居然显示不出来。。。。不知道是什么原因是不是要多打点占位符?


















嗯?



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值