2016-06-07 48 views
0

美好的一天!我想了解爲什麼我的context.Database.Create()仍然通過我的類:DbMigration。如果我不刪除我的數據庫,遷移工作正常。但是,如果我放棄我的數據庫,並開始一個新的。它將通過我的遷移列表並嘗試更新並返回一個關於dbo的錯誤。「tablename」找不到。實體框架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 Db初始化策略之後? 還是隻是我沒有讀好你的問題?

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關於如果存在(如上所見),並強制我的「上下文」來創建它。它仍然通過我的遷移列表。 – gab

+0

看起來很奇怪。 Database.Create()將在運行時禁用初始化程序策略。你的啓動/配置代碼是怎樣的?你運行的是異步嗎?你的課:DbMigration是那個名爲DMSDbContextInitializer的人? – Indregaard