gpt4 book ai didi

entity-framework - WF4 TransactionScope 包含多个带有 EF4 数据库更新的自定义事件

转载 作者:行者123 更新时间:2023-12-04 08:29:52 25 4
gpt4 key购买 nike

我创建了几个自定义事件来更新我的数据库中的表(在本例中为 SQL Server Compact),使用 Entity Framework 4 和 POCO。

如果我在 WF4 TransactionScope 事件中放置多个这些,我就会遇到问题:EF 在第一个事件完成后处理数据库连接,并且当下一个数据库事件尝试进行数据库更新时建立连接。此时抛出异常。

System.Activities.WorkflowApplicationAbortedException : The workflow has been aborted.
----> System.Data.EntityException : The underlying provider failed on Open.
----> System.InvalidOperationException : The connection object can not be enlisted in transaction scope.

我是否必须在整个事务范围内保持 EF 连接打开?我怎样才能做到这一点?为此创建明确的自定义事件,还是有标准方法?

我当前的解决方法是这样的:我创建了一个新的代码事件来创建我们的 ObjectContext 并明确调用 dbContext.Connection.Open()。它返回 ObjectContext,然后将其保存在工作流变量中。该参数作为 InArgument<> 传递给所有与数据库相关的事件。在我的数据库事件中,如果传入此 ObjectContext,我将使用它,否则我会创建一个新对象。

这确实有效,但我对这个解决方案不满意:它需要为每个与数据库相关的事件使用新的 InArgument。在工作流设计器中,我必须在事务范围内插入那个特殊的 OpenDatabaseConnection 事件,然后确保将正确的变量传递到所有 DB 事件中。这似乎非常不优雅且容易出错,尤其是当其他团队成员必须使用这些数据库事件时。

有什么更好的方法来处理这个问题?

最佳答案

问题在于,当您在同一事务范围内打开第二个连接时,会尝试将该事务提升为分布式事务(即使由于您连接到同一数据库,因此没有关于它的任何分布式事务)。 SQL Server CE 不支持这种情况。

我要做的是创建一个自定义“容器”事件,打开(和关闭)连接并使其可供子事件使用。这仍然不是最佳选择,但至少您不再需要传递 InArgument 了。您将获得以下事件树:

TransactionScope
InitializeConnection
Sequence
CustomDataActivity1
CustomDataActivity2
CustomDataActivity3

InitializeConnection 是一个 NativeActivity使用 NativeActivityContext.Properties将连接(或 ObjectContext)公开给子事件。

确保您实现正确的错误处理以确保您始终关闭连接。

注意:完整的 SQL Server 仅通过名为 MSDTC 的 Windows 服务支持分布式事务。 (Microsoft 分布式事务处理协调器)。您可以在“本地服务”中找到它。由于 SQL Server CE 是一个应该能够完全独立运行的数据库,因此它不依赖于 MSDTC 是有道理的。因此它不支持分布式事务。

关于entity-framework - WF4 TransactionScope 包含多个带有 EF4 数据库更新的自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12777649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com