我有两个项目,每个项目都有自己的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中的错误,还是我错过了什么?
答案 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");
}
}