【问题标题】:Code First migrations with multiple DbContexts fail when setting default schema设置默认架构时,具有多个 DbContext 的 Code First 迁移失败
【发布时间】:2016-05-03 18:51:33
【问题描述】:

我有两个项目,每个项目都有自己的 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");
    }
}

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

Enable-Migrations
Add-Migration Initial
Update-Database

这很好用,但是如果我在上面注释掉的行中添加设置默认架构(两个项目使用相同的架构),Update-Database 在第二个项目中失败,并出现错误“已经有一个名为 ' 的对象__MigrationHistory' 在数据库中。”。

通过运行“Update-Database -Verbose”,我可以看到更改了默认架构后,第二个项目执行了“CREATE TABLE [blogtest].[__MigrationHistory]”;如果我不更改默认架构,它只会在第一次尝试创建此表。

这是实体框架中的错误,还是我遗漏了什么?

【问题讨论】:

    标签: entity-framework-6


    【解决方案1】:

    事实证明,这在 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");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 2013-07-13
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 2019-01-16
      相关资源
      最近更新 更多