2016-06-07 1 views
0

Добрый день! Мне хотелось бы получить некоторые идеи о том, почему мой контекст.Database.Create() по-прежнему проходит через мои классы: DbMigration. Если я не удаляю свою базу данных, миграция работает нормально. Но если я опустил свою базу данных и запустил новую. Он перейдет в список переноса и попытается обновить и вернет ошибку о dbo. «Tablename» не найден.Entity Framework context.database.create() все еще проходит через мой класс: DbMigration

Вот код

public class DMSDbContextInitializer : DMSDbContextInitializerBase, IDatabaseInitializer<DMSDbContext> 
{ 
    public void InitializeDatabase(DMSDbContext context) 
    { 
     var dbname = context.Database.Connection.Database; 

     if (context.Database.Exists()) 
     { 

      var migrator = new DbMigrator(new MigrationConfiguration 
       { 
        AutomaticMigrationsEnabled = false 
       }); 

      //Get all pending migrations 
      var pendingmigrations = migrator.GetPendingMigrations().Select(x => new 
      { 
       numericid = Convert.ToInt64(x.Split(new[] { '_' })[0]), 
       migrationid = x 
      }).ToList(); 

      //Get last migration entry 
      var latestMigrationHistory = context.GetMigrationHistories().OrderByDescending(x => x.MigrationId).FirstOrDefault(); 

      if (latestMigrationHistory != null) 
      { 
       var latestmigrationid = Convert.ToInt64(latestMigrationHistory.MigrationId.Split(new[] { '_' })[0]); 

       var prevmigrations = pendingmigrations.Where(x => x.numericid < latestmigrationid); 

       //exclude all prev migration in update and insert a fake history table record for each 
       foreach (var prevmigration in prevmigrations) 
       { 
        context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, 
         @"INSERT INTO __MigrationHistory (MigrationId,ContextKey,Model, ProductVersion) VALUES (@p0,@p1,@p2,@p3)", 
         prevmigration.migrationid, 
         migrator.Configuration.ContextKey, 
         latestMigrationHistory.Model, 
         latestMigrationHistory.ProductVersion 
         ); 
       } 
      } 

      //Execute all valid pending migrations 
      if (migrator.GetPendingMigrations().Any()) 
       migrator.Update(); 

      /*Some seed and update codes*/ 
      context.SaveChanges(); 
     } 
     else 
     { 
      //Create db 
      context.Database.Create(); 
      ConfigureFileTableSupport(context, dbname); 
      ConfigureImageFileTableSupport(context, dbname); 

      //Initial Data 
      Seed(context); 
     } 

В моей context.Database.Create(), если нажать F11, она будет проходить через мой класс: DbMigration. Кажется, я не могу найти то, что здесь виновато.

Вот DbContext

public class DMSDbContext : BaseDbContext, IDMSDbContext 
{ 
    public DMSDbContext() 
     : base("DMSCtx") 
    { 

    } 
    public DMSDbContext(string connectionstring) 
     : base(connectionstring) 
    { 
    } 

    public IDbSet<FileMetadata> FileMetadata { get; set; } 

    public IDbSet<FileMetadataContent> FileMetadataContents { get; set; } 
    public IDbSet<SharedFile> SharedFiles { get; set; } 
    public IDbSet<AuditFileMetadata> AuditFileMetadata { get; set; } 

    public ITransactionScope CreateTransactionScope() 
    { 
     return new EfTransactionScope(Database.BeginTransaction()); 
    } 

    public IEnumerable<T> SqlQuery<T>(string sql, params object[] parameters) 
    { 
     return Database.SqlQuery<T>(sql, parameters); 
    } 

    public int ExecuteSqlCommand(string sql, params object[] parameters) 
    { 
     return Database.ExecuteSqlCommand(sql, parameters); 
    } 

    public string DatabaseName 
    { 
     get { return Database.Connection.Database; } 
    } 

    /// <summary> 
    /// Query the Migration History Table 
    /// </summary> 
    /// <returns></returns> 
    public IList<MigrationHistory> GetMigrationHistories() 
    { 
     return Database.SqlQuery<MigrationHistory>("select * from __migrationhistory").ToList(); 
    } 
} 

public interface IDMSDbContext 
{ 
    IDbSet<FileMetadata> FileMetadata { get; set; } 
    IDbSet<FileMetadataContent> FileMetadataContents { get; set; } 
    IDbSet<SharedFile> SharedFiles { get; set; } 
    IDbSet<AuditFileMetadata> AuditFileMetadata { get; set; } 
    int SaveChanges(); 
    DbContextConfiguration Configuration { get; } 
    ITransactionScope CreateTransactionScope(); 
    IEnumerable<T> SqlQuery<T>(string sql, params object[] parameters); 
    int ExecuteSqlCommand(string sql, params object[] parameters); 
    string DatabaseName { get; } 
} 

ответ

2

Я не уверен, почему вы реализуете «точно»/близка к функциональности, как EF Миграции работает самостоятельно?

Разве это не то, что после стратегии создания базы данных CreateDatabaseIfNotExists? Или это просто я не очень хорошо читаю ваш вопрос?

public class SchoolDBContext: DbContext 
{ 
    public SchoolDBContext(): base("SchoolDBConnectionString") 
    { 
     Database.SetInitializer<SchoolDBContext>(new CreateDatabaseIfNotExists<SchoolDBContext>()); 

     //Database.SetInitializer<SchoolDBContext>(new DropCreateDatabaseIfModelChanges<SchoolDBContext>()); 
     //Database.SetInitializer<SchoolDBContext>(new DropCreateDatabaseAlways<SchoolDBContext>()); 
     //Database.SetInitializer<SchoolDBContext>(new SchoolDBInitializer()); 
    } 
    public DbSet<Student> Students { get; set; } 
    public DbSet<Standard> Standards { get; set; } 
} 

Подробнее: Ef Db initialization strategies Подробнее о миграции: Ef Code First Migrations

+0

извини, я не был в состоянии ответить раньше, да я реализую этот тип инициализации. Если вы увидите отредактированный вопрос в формате моего dbcontext относительно моего вопроса. Также я наследую IDatabaseInitializer на моем инициализаторе класса. – gab

+0

Им все еще любопытно, почему, хотя я создал if-else относительно, если exisiting (как вы можете видеть выше), и заставить мой «контекст» создать его. Он по-прежнему проходит через список моей миграции. – gab

+0

Кажется странным. Database.Create() отключит стратегию инициализации при запуске. Как выглядит ваш код запуска/конфигурации? Вы запускаете что-то асинхронное? ваш класс: DbMigration - это тот, который называется DMSDbContextInitializer? – Indregaard