2014-06-13 16 views
5

我正在使用实体框架6使用数据库迁移进行代码优先开发,并且使用了一个新的数据库,该数据库使用样本种子数据填充。我希望能够在我更改模型时使用该种子数据初始化我的数据库。EF6代码当模型更改时,首先删除表(不是整个数据库)

问题是:我没有数据库创建权限;正因为如此,我不能仅仅利用DropCreateDatabaseIfModelChanges

有没有一种方法,我可以以编程方式删除我所有的表,或者我坚持每次从数据库中手动删除它们?

+0

可能重复(http://stackoverflow.com/questions/7358673/recreate-entity-framework-tables-not-databases) – TheNorthWes

回答

3

最终,我不需要删除这些表格,只是删除了它们包含的数据。

我最终解决了这个问题,只需根据this answer,在我的Seed方法开始时截断表的列表即可。的[重新创建实体框架表,而不是数据库?]

protected override void Seed(MyContext context) 
{ 
    var listOfTables = new List<string> { "Table1", "Table2", "Table3" }; 

    foreach (var tableName in listOfTables) 
    { 
     context.Database.ExecuteSqlCommand("TRUNCATE TABLE [" + tableName + "]"); 
    } 

    context.SaveChanges(); 

    // seed data below 
} 
+1

你不会有FK限制的问题吗? –

+1

我没有必要在我的情况下截断所有表格,而那些截断了的表格没有任何FK限制。如果我确实需要担心,我会确保按照适当的顺序设置我的列表。 –

0

我的建议是使用本地数据库或您拥有完全权限的其他数据库(Azure非常好,如果您有MSDN帐户,则免费)。然后,将其最终的数据库架构迁移到一块石头上并准备投入生产。

这就是说,this might be helpful,但我从来没有尝试过。

0

如果您没有权限访问数据库,最好解决该问题。 总之:

public bool TruncateTable(string connectionString, string schema, string tableName) { 
     var statement = "TRUNCATE TABLE [{0}].[{1}] ;"; 
     statement = string.Format(statement, schema, tableName); 
     return ExecuteSqlStatement(connectionString, statement); 
    } 

    public bool DeleteAllEntriesTable(string connectionString, string schema, string tableName) { 
     var statement = "DELETE FROM [{0}].[{1}] ;"; 
     statement = string.Format(statement, schema, tableName); 
     return ExecuteSqlStatement(connectionString, statement); 
    } 

    public bool ExecuteSqlStatement(string connectionString, string statement, bool suppressErrors = false) { 
     int rowsAffected; 
     using (var sqlConnection = new SqlConnection(connectionString)) { 
      using (var sqlCommand = new SqlCommand(statement, sqlConnection)) { 
       try { 
        sqlConnection.Open(); 
        rowsAffected = sqlCommand.ExecuteNonQuery(); // potential use 
       } 
       catch (Exception ex) { 
        if (!suppressErrors) { 
        // YOUR ERROR HANDLER HERE 
        } 

        return false; 
       } 
      } 
     } 

     return true; 
2

如果你不使用自动迁移,但基于代码的迁移,您可以向下使用如下命令备份一路的第一个版本:

Update-Database –TargetMigration: 0 

这将遵循直到您拥有一个干净的数据库为止,所有迁移中的向下路径。然后,您可以执行:

Update-Database 

这会使所有内容恢复到最新状态。此解决方案假定您已妥善维护您的下行路径并通过迁移对数据进行播种。我这样做是为了我的集成测试,以确保我从数据处于预期状态开始。

+0

我希望这会为我工作,但我的一个后来的迁移引入了一个额外的标识属性复合主键(1..n支持)。理想情况下,我会擦除迁移并添加新的初始迁移,但我不确定该模式还处于最终状态。 –

相关问题