设置默认架构时,具有多个DbContexts的Code First迁移失败

时间:2016-04-29 15:44:34

标签: entity-framework-6

我有两个项目,每个项目都有自己的DbContext类,可以写入同一个SQL Server 2012数据库。

DbContext类的格式为:

public class BlogDbContext : DbContext
{
    public BlogDbContext()
        : base("CodeFirstTestConnString")
    {
    }

    public BlogDbContext(string connectionString)
        : base(connectionString)
    {
    }

    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //modelBuilder.HasDefaultSchema("blogtest");
    }
}

使用代码优先迁移我可以通过在每个项目中执行以下操作在(现有)数据库中创建表:

Enable-Migrations
Add-Migration Initial
Update-Database

这样可以正常工作,但是如果我添加上面注释掉的行来设置默认模式(两个项目都使用相同的模式),则Update-Database在第二个项目中失败并出现错误&#34;已经存在对象名为&#39; __ MigrationHistory&#39;在数据库中。&#34;。

通过运行&#34;更新 - 数据库-Verbose&#34;我可以看到,默认架构已更改,&#34; CREATE TABLE [blogtest]。[__ MigrationHistory]&#34;为第二个项目执行;如果我没有更改默认架构,它只会尝试第一次创建此表。

这是Entity Framework中的错误,还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

事实证明,这在Codeplex中被报告为EF6中的错误。

https://entityframework.codeplex.com/workitem/1685

显示的解决方法是使用自定义HistoryContext来设置默认架构:

internal sealed class Configuration : DbMigrationsConfiguration<ConsoleApplication11.MyContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;

        SetHistoryContextFactory("System.Data.SqlClient", (c, s) => new MyHistoryContext(c, s));
    }
}

internal class MyHistoryContext : HistoryContext
{
    public MyHistoryContext(DbConnection existingConnection, string defaultSchema) : base(existingConnection, defaultSchema)
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.HasDefaultSchema("foo");
    }
}