我们正在使用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版本的脚本可以删除所有表中的所有数据?
答案 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中)