2016-06-07 17 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