gpt4 book ai didi

c# - Entity Framework - CommitFailureHandler.ClearTransactionHistory()

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:51 25 4
gpt4 key购买 nike

我遇到了一个关于 Entity Framework 6.1 中的 commitFailureHandler.ClearTransactionHistory(); 方法的问题。当我第一次运行它时,我收到一个异常,指出 'dbo.EFTransactionHistory' 无效。

InnerException: System.Data.SqlClient.SqlException
HResult=-2146232060
Message=Invalid object name 'dbo.EFTransactionHistory'.
Source=.Net SqlClient Data Provider
ErrorCode=-2146232060
Class=16
LineNumber=1
Number=208
Procedure=""
Server=********
State=1

我检查了数据库,当然那个表不存在。当然,我们应该在每次应用程序启动时执行此方法。在这种情况下,它是一个 WCF 服务,我制作了一个自定义服务初始化器,因此无论何时启动 mex 或第一个服务调用进入,它都会初始化服务将需要的一些资源。

这是我的服务的 web.config 中的内容:

<entityFramework codeConfigurationType="WSI.Common.DataAccess.Configuration.EntityFramework.TransactionDbConfiguration, WSI.Common.DataAccess">

在这里,我使用以下代码扩展了 DbConfiguration 类:

public class TransactionDbConfiguration : DbConfiguration
{
public TransactionDbConfiguration()
{
SetTransactionHandler(SqlProviderServices.ProviderInvariantName, () => new CommitFailureHandler(c => new DbTransactionContext(c)));
SetExecutionStrategy(SqlProviderServices.ProviderInvariantName, () => new SqlAzureExecutionStrategy());
}
}

接下来是我扩展 TransactionContext 类的代码:

    public class DbTransactionContext : TransactionContext
{
public DbTransactionContext(DbConnection dbConnection) : base(dbConnection)
{

}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<TransactionRow>().ToTable("EFTransactionHistory");
}
}

然后在我的 ServiceInitializer 类中,我通过传递 DbContext 的实例来调用静态方法,如下所示:

protected static void Initialize(DbContext dbContext)
{
if (dbContext != null)
{
using (CommitFailureHandler commitFailureHandler = CommitFailureHandler.FromContext(dbContext))
{
if (commitFailureHandler != null)
{
commitFailureHandler.ClearTransactionHistory();
//commitFailureHandler.PruneTransactionHistory();
}
}
}
}

当然,如果我删除 commitFailureHandler.ClearTransactionHistory(); 并运行该应用程序,一旦我在服务运行的正常过程中更新了数据库中的任何实体,它将创建 dbo.EFTransactionHistory 表。然后我停止服务,我包含 commitFailureHandler.ClearTransactionHistory(); 方法,它将起作用。

一些 ClearTransactionHistory() 应该如何在尝试从表中删除行或触发 OnModelCreating() 方法之前检查表是否存在。

我已经为此工作了几天,我很想找到解决这个问题的方法。

谢谢

最佳答案

尝试在您的 Initialize 方法中添加以下内容:

dbContext.Database.Initialize(true);

这应该触发/强制数据库初始化。

关于c# - Entity Framework - CommitFailureHandler.ClearTransactionHistory(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25892623/

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