【问题标题】:Entity Framework - CommitFailureHandler.ClearTransactionHistory()实体框架 - CommitFailureHandler.ClearTransactionHistory()
【发布时间】:2014-11-11 14:39:45
【问题描述】:

关于 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() 方法。

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

谢谢

【问题讨论】:

    标签: c# sql-server entity-framework wcf entity-framework-6


    【解决方案1】:

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

    dbContext.Database.Initialize(true);
    

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

    【讨论】:

    • 我添加了 'dbContext.Database.Initialize(true);'就在我检查静态 Initialize() 方法中的 dbContext 是否为空之后。我仍然遇到同样的问题。现在我应该注意,我没有采用代码优先方法......我采用模型优先方法来创建我的数据库,然后从中创建我的实体。我不知道这是否有区别。我认为不会。
    猜你喜欢
    • 2017-07-07
    • 2020-04-11
    • 1970-01-01
    • 2015-12-26
    • 2014-04-01
    • 2021-05-01
    • 1970-01-01
    • 2010-10-07
    • 2011-08-21
    相关资源
    最近更新 更多