SQL Server CE。从所有表中删除数据以进行集成测试

时间:2013-03-18 12:03:58

标签: entity-framework sql-server-ce integration-testing

我们正在使用SQL Server CE进行集成测试。在每次测试之前,我们删除所有列中的所有数据,然后重新播种测试数据。我们在结构发生变化时删除数据库文件。

要删除数据,我们需要按正确顺序遍历每个表并发出Delete from table blah,这很容易出错。我多次在添加新实体时忘记添加删除语句。因此,如果我们可以从表中自动删除数据,那将是一件好事。

我见过Jimmy Bogard对deletion of data in the correct order的善意。我已经为实体框架实现了它,并且在完整的SQL Server中工作。但是当我尝试在SQL CE中使用它进行测试时,我得到了异常,说

System.Data.SqlServerCe.SqlCeException : The specified table does not exist. [ @@sys.tables ]

SQL CE没有支持所需信息的支持系统表。

是否有适用于SQL CE版本的脚本可以删除所有表中的所有数据?

1 个答案:

答案 0 :(得分:1)

SQL Server Compact确实具有列出所有表的系统表。在我的SQL Server Compact脚本API中,我有代码以“正确”的顺序列出表,而不是一个简单的任务!我使用QuickGraph,它有一个扩展方法来排序DataSet。您应该能够在测试代码中重用其中的一些内容: 33

public void SortTables()
{
    var _tableNames = _repository.GetAllTableNames();
    try
    {
        var sortedTables = new List<string>();
        var g = FillSchemaDataSet(_tableNames).ToGraph();
        foreach (var table in g.TopologicalSort())
        {
            sortedTables.Add(table.TableName);
        }
        _tableNames = sortedTables;
        //Now iterate _tableNames and issue DELETE statement for each
    }
    catch (QuickGraph.NonAcyclicGraphException)
    {
        _sbScript.AppendLine("-- Warning - circular reference preventing proper sorting of tables");
    }
}

您必须添加QuickGraph DLL文件(来自Codeplex或NuGet),您可以在此处找到GetAllTableNames和FillSchemaDataSet的实现http://exportsqlce.codeplex.com/SourceControl/list/changesets(在Generator.cs和DbRepository.cs中)