我有一个针对个人项目的数据库项目,我正在尝试将代码部署到我的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.
答案 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}'.");
}
。
答案: 您可以使用发布配置文件并在其中硬编码目标数据库。