如果不存在,如何使用Visual Studio中的数据库项目创建数据库?

时间:2019-04-02 20:57:14

标签: sql-server visual-studio database-project

我有一个针对个人项目的数据库项目,我正在尝试将代码部署到我的DEV服务器。我经常删除并重新创建我的DEV服务器。现在,DEV Server是使用SQL Server新创建的。每次我要部署代码时,都必须手动创建数据库项目,然后发布数据库项目。我想通过数据库项目部署自动创建数据库。

现在,我有一个创建数据库的脚本,但是我必须手动执行它。而且这很正常,但是我也想使这一步骤自动化。

这甚至可能吗?如果是,那怎么办?请逐步说明。我们还会在连接字符串中提到初始目录吗?

编辑: 我尝试使用

创建数据库
CREATE DATABASE LocalDbTest

在预部署脚本中。但这没有用。它正在创建数据库,但随后表未在其下创建表。由于我将master数据库用作默认数据库,因此它将在master下创建表。不允许我选择LocalDbTest数据库作为默认数据库,因为它尚未创建,因此我必须选择Master作为默认数据库。我尝试通过以下方式更改数据库:

USE LocalDbTest
GO

我是在创建数据库后立即使用它的,但是这没有用,因为生成脚本时它会变回默认数据库。生成脚本时,这部分会自动出现。

USE [$(DatabaseName)];
GO

Visual Studio也不允许我在表名前面添加数据库名称,例如:

CREATE TABLE [LocalDbTest].[dbo].[TestTable]

我遇到错误:

When you create an object of this type in a database project, the object's name must contain no more than two parts.

1 个答案:

答案 0 :(得分:1)

如果已准备好创建数据库的脚本,则可以使用Pre-build事件来调用SQLCMD并运行脚本。

编辑: 如果您无法指向不存在的数据库,则可能必须手动编辑发布配置文件(例如dev.publish.xml)并显式设置TargetDatabaseName元素。如果您希望每次发布时都重新创建CreateNewDatabase元素,也可以将True元素设置为public static int ShortestDistance(Graph graph, Node from, Node to) { var distances = new Dictionary<Node, int>(); var actualNodes = graph.GetNodes() as List<Node> ?? Graph.GetNodes().ToList(); foreach (var node in actualNodes) distances[node] = int.MaxValue; foreach (var adjacent in graph.GetAdjacentsByNode(from)) { distances[adjacent.To] = adjacent.Weight; } while (actualNodes.Count() != 0) { var actualShortest = actualNodes.OrderBy(n => distances[n]).First(); actualNodes.Remove(actualShortest); if (distances[actualShortest] == int.MaxValue) break; if (actualShortest.Equals(to)) return distances[actualShortest]; foreach (var adjacent in graph.GetAdjacentsByNode(actualShortest)) { var actualDistance = distances[actualShortest] + adjacent.Weight; if (actualDistance >= distances[adjacent.To]) continue; distances[adjacent.To] = actualDistance; } } throw new Exception($"There's no such route from '{from}' to '{to}'."); }

答案: 您可以使用发布配置文件并在其中硬编码目标数据库。