实体框架6.1.3迁移忽略第二个上下文

时间:2016-08-10 00:56:09

标签: entity-framework entity-framework-6

我们有两个模型,共享模型和个人模型,每个模型都有自己的上下文。共享模型包括所有单个项目的列表以及各种元数据。每个单独的项目都有一个外键返回此列表。

当运行个人模型的迁移时,我们会在"种子"期间连接回共享上下文。获取该项目的一些列表元数据的方法。每种类型的上下文可能有多个实例一次处于活动状态,因此我们通过"应用程序名称"将我们所需的共享上下文连接字符串片段隐藏到个别字符串中。属性并在代码中动态生成共享的一个。它有点作弊,但是在使用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>

0 个答案:

没有答案