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很奇怪,下面这一截居然显示不出来。。。。不知道是什么原因是不是要多打点占位符?
嗯?