Linq to sql Linq to SQL:每个请求只使用一个DataContext是否正确?

Linq to sql Linq to SQL:每个请求只使用一个DataContext是否正确?,linq-to-sql,datacontext,Linq To Sql,Datacontext,我们在这里使用LINQtoSQL。目前,我们的存储库倾向于更新自己的DataContext对象,因此如果您使用多个存储库,那么您使用的是多个DataContext 我正在做一些重构,以便在我们的工作中允许依赖注入。我假设我们需要“每个请求1个DataContext”模式,因此我将向所有存储库中注入相同的DataContext(web请求所特有的) 但是今天发生了一些事情。重构之后,我们得到了ForeignKeyReferenceAlreadyHasValueException,因为设置了外键字段

我们在这里使用LINQtoSQL。目前,我们的存储库倾向于更新自己的DataContext对象,因此如果您使用多个存储库,那么您使用的是多个DataContext

我正在做一些重构,以便在我们的工作中允许依赖注入。我假设我们需要“每个请求1个DataContext”模式,因此我将向所有存储库中注入相同的DataContext(web请求所特有的)

但是今天发生了一些事情。重构之后,我们得到了ForeignKeyReferenceAlreadyHasValueException,因为设置了外键字段,而不是设置了相应的关联属性。就我从Google所知,在Linq到SQL中直接设置外键是错误的(即,我们的代码这样做是错误的),但直到我完成重构之后,我们才发现错误


所以我只想检查一下——每个请求一个DataContext绝对是正确的方法吗?

每个请求一个DataContext是一种方法,不是唯一的方法,但通常是一种好方法

通过使用单个DataContext,您可以将所有提交保存到请求末尾,并一次提交所有更改。SubmitChanges自动封装事务中的所有更改

如果使用多个上下文,则需要将请求封装在事务中,以便在请求中途失败时回滚更改。使用多个上下文会增加一些开销,但这通常并不重要


我在不同的应用程序中使用过单个和多个DataContext,两者都很好,如果需要大量重写才能转到单个DataContext,那么如果没有任何其他强有力的重写理由,您可以保留多个上下文。

每个请求一个DataContext是一种方法,而不是唯一的方法,但通常都是好的

通过使用单个DataContext,您可以将所有提交保存到请求末尾,并一次提交所有更改。SubmitChanges自动封装事务中的所有更改

如果使用多个上下文,则需要将请求封装在事务中,以便在请求中途失败时回滚更改。使用多个上下文会增加一些开销,但这通常并不重要


我在不同的应用程序中使用过单个和多个DataContext,两者都很好,如果需要大量重写才能转到单个DataContext,那么如果没有任何其他强烈的重写理由,您可以保留多个上下文。

如果您使用transactionscope,然后您会发现,当transactionscope中的事务处于挂起状态时,multiple-datacontexts方法将为每个新存储库创建一个新的DB连接,该存储库具有一个新的datacontext。当一个事务作用域包装了一个请求,该请求使用大量存储库对象执行工作,并且池中的连接用完时,我们遇到了这种情况。
因此,如果您计划使用trnasactionscope管理事务中的复杂业务流程,一定要使用共享数据上下文。

如果您使用transactionscope,然后您会发现,当transactionscope中的事务处于挂起状态时,multiple-datacontexts方法将为每个新存储库创建一个新的DB连接,该存储库具有一个新的datacontext。当一个事务作用域包装了一个请求,该请求使用大量存储库对象执行工作,并且池中的连接用完时,我们遇到了这种情况。
因此,如果您计划使用trnasactionscope来管理事务中的复杂业务流程,一定要使用共享数据上下文。

从我最初的帖子开始的几个月后,我们没有遇到任何其他问题,显然从缓存中获益。从我最初的帖子开始的几个月后,我们没有遇到任何其他问题,显然从缓存中获益匪浅。