最初,我们的解决方案将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();
}
仍然持开放态度!
答案 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,因为它生成带有索引的数据库以及我们想要的更好的命名。在此之后或在发布模式中,我们希望使用具有我们想要的重试逻辑的自定义提供程序。