2016-04-29 2 views
0

Ich habe zwei Projekte mit jeweils einer eigenen DbContext-Klasse, die in die gleiche SQL Server 2012-Datenbank schreiben.Code Erste Migrationen mit mehreren DbContexts scheitern beim Festlegen des Standardschemas

Die DbContext Klassen sind von der Form:

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"); 
    } 
} 

Verwenden von Code Erste Migrations Ich kann meine Tabellen in der (bestehenden) Datenbank durch Ausführen der folgenden in jedem Projekt erstellen:

Enable-Migrations 
Add-Migration Initial 
Update-Database 

Diese funktioniert gut, aber wenn ich in der Zeile oben kommentiert, um das Standardschema zu setzen (beide Projekte verwenden das gleiche Schema), schlägt Update-Datenbank im zweiten Projekt mit dem Fehler "Es gibt bereits ein Objekt mit dem Namen '__MigrationHistory' in der Datenbank.".

Durch Ausführen von "Update-Database -Verbose" kann ich sehen, dass mit dem Standardschema geändert "CREATE TABLE [blogtest]. [__ MigrationHistory]" für das zweite Projekt ausgeführt wird; Wenn ich das Standardschema nicht ändere, versucht es nur, diese Tabelle das erste Mal zu erstellen.

Ist das ein Bug in Entity Framework, oder fehlt mir etwas?

Antwort

0

Es stellt sich heraus, dass dies in Codeplex als Fehler in EF6 gemeldet wird.

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

Die Abhilfe gezeigt gibt es eine benutzerdefinierte HistoryContext verwenden, um das Standardschema zu setzen:

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"); 
    } 
} 
Verwandte Themen