ClearTransactionHistory

ClearTransactionHistory

关于实体框架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);


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

10-07 20:19