结构图在后台进程中在ASP.NET中创建linqtosql datacontext的问题

时间:2011-01-04 10:14:43

标签: asp.net-mvc structuremap

我有一个带有LinqToSql的ASP.NET MVC应用程序。数据层包含用于对数据库执行crud操作的方法。每个方法都可以从structuremap请求一个datacontext,它被配置为每个http请求返回相同的datacontext(InstanceScope.Hybrid),所以我可以在数据层上调用几个方法,最后调用submitchanges,所以所有的crud操作都是包含在一个交易中。到目前为止,这工作正常。 我还有工作流活动(使用WF4),当然在单独的线程中运行工作流线程。一些活动也使用相同的数据层执行crud操作。问题是,结构图(有时)为不同的活动返回相同的datacontext,可能是因为这些活动在同一工作流线程上运行。这会导致问题,因为datacontext可能会缓存实体的实例,这些实体在执行两个活动之间已经更改(因为数据是从Web应用程序更改的)。

例如

活性1

  • 在datalayer上调用方法A =>方法A从structuremap =>请求datacontext。返回datacontext X1
  • 在datalayer上调用方法B =>方法B从structuremap =>请求datacontext。 返回datacontext X1
  • 调用submitchanges,A和B已提交

Web应用程序

  • 在datalayer上调用方法B =>方法B从structuremap =>请求datacontext。返回datacontext X2
  • 调用submitchanges,B被提交

活动2

  • 在datalayer上调用方法B =>方法B从structuremap =>请求datacontext返回datacontext X1(=>这里我需要另一个datacontext)。

Datacontext X1是缓存实体实例,Web应用程序之间已经改变了实体,所以我得到了changeconflict异常

从web应用程序,结构图instancecope hybrid是可以的,因为每个web请求都会给我另一个datacontext实例,从WF这不行......我无法在WF中配置structuremap以返回每个请求的实例,因为这会给方法A和方法B中的不同datacontexts ...所以A和B不会包含在一个事务中。

也许如果我能告诉structuremap处理datacontext,每当调用submitchanges时,这都会解决我的问题,但我不知道是否或如何使用structuremap来完成。

1 个答案:

答案 0 :(得分:0)

我相信你想要的EjectAllInstances方法;这将摆脱数据上下文的缓存实例,因此下次从StructureMap请求它时,它将被创建为新的。