defaultConnectionFactory是否会影响使用EF Code First生成密钥和索引?

时间:2013-09-13 19:08:09

标签: entity-framework ef-code-first

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

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

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

我们已经根据罗伯特·摩尔创建的ReliableDbProvider的概念in this post切换到自定义connectionfactory,因为我们希望使用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();
}

仍然持开放态度!

1 个答案:

答案 0 :(得分: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构造函数,以便在代码中而不是在config中设置DefaultConnectionFactory。仅在开发(调试模式)中,如果db不存在,我们首先设置为SqlConnectionFactory,因为它生成带有索引的数据库以及我们想要的更好的命名。在此之后或在发布模式中,我们希望使用具有我们想要的重试逻辑的自定义提供程序。