是否可以复制和现有数据库,或者生成sql然后针对sql数据库运行它来创建现有数据库的副本?
我不关心数据,只关心模式。
我想为单元测试做这个。我知道我可以使用sqlite,但我很好奇这无论如何都会起作用。
我没有任何存储过程或任何东西,只是表格和PK / FK等。
我想最好的方法是以某种方式生成sql架构,然后只针对数据库运行它。
或者如果更容易,请复制数据库,然后截断表。
注意:我想知道如何做到这一点以编程方式。
答案 0 :(得分:4)
您可以通过右键单击数据库来生成脚本 - >任务 - >从sql management studio生成脚本。 在向导中,您可以在高级设置(取决于sql管理工具版本)下选择是否需要架构,数据或两者。
<强>更新强>
要以编程方式创建数据库,您可以使用生成的sql并通过ADO.NET执行它。 或者,如果您使用CodeFirst,如果您为测试类中的上下文设置CreateDatabaseIfNotExists初始化程序,它可以自动执行此操作。您可以使用Visual Studio的Entity Framework Power Tools对现有应用程序进行逆向工程,从数据库中创建CodeFirst上下文。在这种情况下,您只需要为不存在的数据库指定连接字符串,CF将为您创建它。您还可以指定DropCreateDatabaseAlways以在每次运行测试时刷新数据库(与每次在为有问题的数据库添加前生成sql脚本之后执行sql查询相同) 如果使用codefirst,则不需要生成sql脚本。
如果您更喜欢这些方法,我可以为您提供更多资源吗?
答案 1 :(得分:3)
您可以在nhibernate中以编程方式执行此操作。 Nhibernate创建所有表 和数据库中的关系你只创建数据库实例(名称) 任何数据库服务器,如Oracle,MySQL,MsSQL ......
您可以查看this了解详情。
答案 2 :(得分:1)
您可以使用SQL Server Management Objects Class库中的对象。
例如,Database类实现了IScriptable。我会用它作为我的起点(但我自己并没有这样做)。这个生成的脚本可能有太多不相关的内容,在这种情况下,您可能需要枚举单个表并为它们生成脚本。
但SMO总是(如今)“我如何针对SQL Server执行管理任务X?”答案。