1

最初,我们的解决方案将 System.Data.Entity.Infrastructure.LocalDbConnectionFactory 设置为 web.config 中的 defaultConnectionFactory 类型。

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0" />
  </parameters>

我不确定我们是否真的需要它,因为我们使用本地 SQL Server 进行开发,使用 SQL Azure 进行实际部署。我们使用 EF Code First,并使用名为 PK_dbo.Customers 和 FK_dbo.Customers_dbo.Employers_EmployerID 的键创建表,并为每个外键创建索引,如 IX_EmployerID。

我们已根据本文中的想法切换到自定义连接工厂用于由 Robert Moore 创建的 ReliableDbProvider,因为我们希望为 SQL Azure 的瞬时故障内置重试逻辑。它似乎工作正常,但似乎也导致键的名称不同(PK__Customer__A4AE64B8BB3388DF,Customer_Employer)并且不生成索引。

我没想到工厂会影响一代人。知道它是如何贡献的吗?

在反映了一些代码之后,似乎它与在 DropCreateDatabaseIfModelChanges 初始化程序中使用的 DbMigrationsConfiguration 类的工作方式有关,所以我们必须看看是否可以以某种方式覆盖它。

public DbMigrationsConfiguration()
{
this.SetSqlGenerator("System.Data.SqlClient", new SqlServerMigrationSqlGenerator());
this.SetSqlGenerator("System.Data.SqlServerCe.4.0", new SqlCeMigrationSqlGenerator());
this.CodeGenerator = new CSharpMigrationCodeGenerator();
}

仍然对想法持开放态度!

4

1 回答 1

0

根据一些反映的代码,问题似乎在于 DatabaseCreator 类中的非 System.Data.SqlClient 或 sqlce 提供程序存在硬编码逻辑,这迫使生成沿着不同的路径进行。

public void CreateDatabase(InternalContext internalContext, Func<DbMigrationsConfiguration, DbContext, DbMigrator> createMigrator, ObjectContext objectContext)
    {
        if (internalContext.CodeFirstModel == null || !(internalContext.ProviderName == "System.Data.SqlClient") && !(internalContext.ProviderName == "System.Data.SqlServerCe.4.0"))
        {
            internalContext.DatabaseOperations.Create(objectContext);
            internalContext.SaveMetadataToDatabase();
        }
        else
        {
            Type type = internalContext.Owner.GetType();
            DbMigrationsConfiguration dbMigrationsConfiguration = new DbMigrationsConfiguration();
            dbMigrationsConfiguration.ContextType = type;
            dbMigrationsConfiguration.AutomaticMigrationsEnabled = true;
            dbMigrationsConfiguration.MigrationsAssembly = type.Assembly;
            dbMigrationsConfiguration.MigrationsNamespace = type.Namespace;
            dbMigrationsConfiguration.TargetDatabase = new DbConnectionInfo(internalContext.OriginalConnectionString, internalContext.ProviderName);
            createMigrator(dbMigrationsConfiguration, internalContext.Owner).Update();
        }
        internalContext.MarkDatabaseInitialized();
    }

最后,我们更新了 datacontext 构造函数,以便在代码中而不是在配置中设置 DefaultConnectionFactory。仅在开发(调试模式)中,如果 db 不存在,我们首先设置为 SqlConnectionFactory,因为它会生成带有索引和更好命名的 db。之后或在发布模式下,我们希望使用具有我们想要的重试逻辑的自定义提供程序。

于 2013-09-16T17:51:29.723 回答