2016-11-08 2 views
3

Моя автоматическая миграция продолжает давать мне эту ошибку при попытке обновить базу данных.Entity Framework Автоматические миграции, которые влияют на местоположение истории миграции

Автоматические миграции, которые влияют на расположение Миграции истории системы таблицы (например, изменения схемы по умолчанию) не поддерживаются. Для операций, которые влияют на , используйте миграцию на основе кода для определения местоположения таблицы систем статистики миграции.

Вот мой код:

[DbConfigurationType(typeof(AlvinCMSExtension.Migration.AlvinCMSCustomHistoryConfiguration))] 
public class AccountDBContext : DbContext 
{ 
    public AccountDBContext() 
     : base("DefaultConnection") 
    { 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<Alvin_CMS.Models.AccountDBContext, Alvin_CMS.Migrations.AccountDBContext.Configuration>()); 
    } 

    public DbSet<UserProfile> UserProfiles { get; set; } 
    public DbSet<Membership> Memberships { get; set; } 
    public DbSet<Role> Roles { get; set; } 
    public DbSet<UsersInRole> UsersInRoles { get; set; } 
    public DbSet<OAuthMembership> OAuthMemberships { get; set; } 

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

     SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString()); 
     string query = "select schema_name()"; 

     if (con.State == ConnectionState.Closed) 
      con.Open(); 

     SqlCommand com = new SqlCommand(query, con); 
     var x = com.ExecuteScalar(); 

     if (con.State == ConnectionState.Open) 
      con.Close(); 

     modelBuilder.HasDefaultSchema(x.ToString()); 
    } 
} 

internal sealed class Configuration : DbMigrationsConfiguration<Alvin_CMS.Models.AccountDBContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
     MigrationsDirectory = @"Migrations\AccountDBContext"; 
     //SetHistoryContextFactory("System.Data.SqlClient", (conn, schema) => new AccountHistoryContext(conn, schema)); 
    } 

    protected override void Seed(Alvin_CMS.Models.AccountDBContext context) 
    { 
     // This method will be called after migrating to the latest version. 

     // You can use the DbSet<T>.AddOrUpdate() helper extension method 
     // to avoid creating duplicate seed data. E.g. 
     // 
     // context.People.AddOrUpdate(
     //  p => p.FullName, 
     //  new Person { FullName = "Andrew Peters" }, 
     //  new Person { FullName = "Brice Lambson" }, 
     //  new Person { FullName = "Rowan Miller" } 
     // ); 
     // 
    } 
} 

public class CustomHistoryContext : HistoryContext 
{ 
    public CustomHistoryContext(DbConnection dbConnection, string defaultSchema) 
     : base(dbConnection, defaultSchema) 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.HasDefaultSchema("dbo"); 
     modelBuilder.Entity<HistoryRow>().ToTable(tableName: "__MigrationHistory", schemaName: "dbo"); 
     //modelBuilder.Entity<HistoryRow>().ToTable(tableName: "__MigrationHistory", schemaName: "dbo"); 
    } 
} 

public class AlvinCMSCustomHistoryConfiguration : DbConfiguration 
{ 
    public AlvinCMSCustomHistoryConfiguration() 
    { 
     this.SetHistoryContext("System.Data.SqlClient", 
      (connection, defaultSchema) => new CustomHistoryContext(connection, "dbo")); 
    } 
} 

я могу сделать миграцию без каких-либо проблем с другой БД контекста, но только с этим AccountDBContext ошибка происходит всегда. В чем причина этой ошибки?

+0

Одним из плохих решений будет удаление базы данных, а затем миграция, если в базе данных нет ничего важного. –

+0

Я сделал это во вновь созданной базе данных, результат тот же –

ответ

1

Ошибка в том, что вы определили имя пользовательской схемы. Если вы хотите использовать собственное имя схемы, вы не можете использовать автоматическую миграцию. Если вы хотите использовать автоматическую миграцию, удалите вызов HasDefaultSchema в пределах OnModelCreating.

Here is как можно активировать первые миграционные процессы.

Смежные вопросы