在我的 WebAPI 控制器中我有这个:
[HttpDelete]
public HttpResponseMessage DeleteFolder(int id)
{
_service.DeleteFolder(id);
return Request.CreateResponse(HttpStatusCode.OK, "Deleted");
}
_service 是使用 _db 的数据库访问服务 - 我的项目 DbContext 的实例,在服务类的构造函数中定义一次。
在我的客户端中,我使用 for 循环向删除方法发送一堆异步 AJAX 调用,尝试连续删除多个文件夹。这时候就会出现这样的事情:
和这个:
开始发生。我有一种感觉,这是由于竞争条件造成的,但我不知道如何解决它,如果是这样的话。我应该为每次调用创建一个新的 dbcontext 实例吗?如果是这样,应该在哪里创建它?在repository.cs的每个方法中(为每个方法的使用创建一个dbContext)?
任何帮助将非常感激。
是的,每次调用都需要一个单独的 DbContext。来自docs http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.103).aspx;
此类型的任何公共静态(在 Visual Basic 中为共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。
您可以做的(例如,取决于您如何使用事务)是使用工作单元 http://msdn.microsoft.com/en-us/magazine/dd882510.aspx模式,如果 EF 的情况基本上意味着包装你的DbContext
在一个类中(您不希望它将 EF 特定类(如 DbContext)暴露给您的业务类),以便您在应用程序代码(或者,取决于分层、业务代码)中可以编写类似的内容;
[HttpDelete]
public HttpResponseMessage DeleteFolder(int id)
{
using(var uow = new UnitOfWork()) { // Creates a new DbContext
_service.DeleteFolder(uow, id);
uow.Commit();
return Request.CreateResponse(HttpStatusCode.OK, "Deleted");
} // Uncommitted UoW rolls back on Dispose
} // ie on unhandled exceptions.
...或者如果您认为通过每个服务/存储库方法传递 UoW 很烦人(我确实如此),您可以让 UnitOfWOrk 构造函数将其保存为“当前活动的工作单元”HttpContext.Current.Items
,以便任何服务/存储库都可以在需要时获取当前的工作单元。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)