0

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

为了删除数据,我们需要以正确的顺序和问题遍历每个表,Delete from table blah这很容易出错。很多时候,我只是在添加新实体时忘记添加删除语句。因此,如果我们可以自动从表中删除数据,那就太好了。

我已经看到 Jimmy Bogard以正确的顺序删除数据的优点。我已经为实体框架实现了这一点,并且可以在成熟的 SQL Server 中使用。但是当我尝试在 SQL CE 中使用它进行测试时,我得到了异常,说

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

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

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

4

1 回答 1

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 中)

于 2013-03-18T12:28:08.767 回答