我们有两个模型,共享模型和个人模型,每个模型都有自己的上下文。共享模型包括所有单个项目的列表以及各种元数据。每个单独的项目都有一个外键返回此列表。
当运行个人模型的迁移时,我们会在"种子"期间连接回共享上下文。获取该项目的一些列表元数据的方法。每种类型的上下文可能有多个实例一次处于活动状态,因此我们通过"应用程序名称"将我们所需的共享上下文连接字符串片段隐藏到个别字符串中。属性并在代码中动态生成共享的一个。它有点作弊,但是在使用Entity Framework 6.0.1的过程中它运行了很长时间,但是最近升级到6.1.3似乎打破了这个并且我没有做到这一点。我知道为什么。
这是我们的一些代码:
public class IndividualConfiguration : DbMigrationsConfiguration<IndividualContext>
{
protected override void Seed(IndividualContext context)
{
var store = context.Stores.FirstOrDefault();
var storeListingId = store.StoreListingId;
var sharedContext = GetSharedContextFromIndividualContext(context);
var storeListing = sharedContext.StoreListings.FirstOrDefault(p => p.Id == storeListingId);
/* Use listing metadata for things... */
}
public SharedContext GetSharedContextFromIndividualContext(IndividualContext context)
{
var connString = context.Database.Connection.ConnectionString;
var builder = new SqlConnectionStringBuilder(connString);
/* Derive shared context info from the Application Name... */
builder.InitialCatalog = derivedCatalog;
builder.DataSource = derivedDataSource;
builder.ApplicationName = string.Empty;
return new SharedContext(builder.ConnectionString);
}
}
我进入Nuget Package Manager控制台的迁移命令是:
update-database -configuration "IndividualConfiguration"
-ConnectionString "Data Source=localhost;Initial Catalog=IndividualDatabase; Integrated Security=True;
MultipleActiveResultSets=True; Application Name=SharedDatabase|localhost"
-ConnectionProviderName "System.Data.SqlClient" -force –verbose
注意&#34; SharedDatabase | localhost&#34;在应用程序名称中使用。这些是匹配的共享上下文的目录和数据源。通过调试器查看结果,我可以确认&#34; builder.ConnectionString&#34;已构建正确的连接字符串,即:
"Data Source=localhost;Initial Catalog=SharedDatabase;Integrated Security=True;MultipleActiveResultSets=True;Application Name="
...然而,当查找&#34; StoredListings&#34;来自返回的sharedContext的DbSet,代码错误输出&#34;无效的对象名称&#39; dbo.StoreListings&#39;。&#34;
在对此进行故障排除时,我尝试修改获取SharedContext的代码以查看出现问题的时间:
var ctx = new SharedContext(builder.ConnectionString);
var connBefore = ctx.Database.Connection.ConnectionString;
string latestMigration = ctx.Database.SqlQuery<string>("SELECT TOP 1 MigrationId FROM [__MigrationHistory] ORDER BY MigrationId DESC").FirstOrDefault();
var connAfter = ctx.Database.Connection.ConnectionString;
throw new Exception("CONN BEFORE: " + connBefore + Environment.NewLine + Environment.NewLine + "CONN AFTER : " + connAfter + Environment.NewLine + Environment.NewLine + "LAST MIGRATION: " + latestMigration);
......结束于:
CONN BEFORE: Data Source=localhost;Initial Catalog=SharedDatabase;Integrated Security=True;MultipleActiveResultSets=True;Application Name=
CONN AFTER : Data Source=localhost;Initial Catalog=IndividualDatabase; Integrated Security=True; MultipleActiveResultSets=True; Application Name=SharedDatabase|localhost
LAST MIGRATION: 201607081517538_LatestIndividualMigration
因此,出于某种原因,尽管共享上下文的连接字符串是正确的,但在使用连接时它会恢复为我在迁移命令中使用的相同字符串。
有谁知道为什么第二个上下文会被忽略?我可以确认,如果我恢复到Entity Framework 6.0.1,一切都会重新开始工作,所以我想说从6.0.1改为6.1.3会使我们的代码无效,但我不知道那可能是什么。 / p>