如何在构建时修改DACPAC模型?

时间:2018-01-30 10:20:30

标签: sql-server visual-studio sql-server-data-tools

我想在BuildContributor的构建时间内更改表模型。以下是一些示例代码:

using Microsoft.SqlServer.Dac.Deployment;
using Microsoft.SqlServer.Dac.Extensibility;
using Microsoft.SqlServer.Dac.Model;
using System.Collections.Generic;
using System.Linq;

namespace MyNamespace
{
    [ExportBuildContributor("MyNamespace.MyBuildContributor", "1.0.0.0")]
    public class MyBuildContributor : BuildContributor
    {
        protected override void OnExecute(BuildContributorContext context, IList<ExtensibilityError> messages)
        {
            foreach (var table in context.Model.GetObjects(DacQueryScopes.UserDefined, ModelSchema.Table))
            {
                var tableName = table.Name.Parts.Last();
                var rowId = "alter table " + tableName + " add rowid uniqueidentifier";
                context.Model.AddObjects(rowId);
            }
        }
    }
}

构建成功且没有错误,但当我查看rowid中的model.xml文件时,我在任何表格中都看不到bin\Debug\MyDb.dacpac

1 个答案:

答案 0 :(得分:0)

您不能在此上下文中使用Model.AddObjects。

来自(https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dac.model.tsqlmodel.addobjects(v=sql.120).aspx#M:Microsoft.SqlServer.Dac.Model.TSqlModel.AddObjects(System.String))的Model.AddObjects:

“根据TSql脚本字符串的内容向模型添加对象。脚本应包含有效的TSql DDL语句。使用此方法添加的对象以后无法更新或删除,因为更新/删除需要脚本添加对象时要指定的名称。如果这是一个要求,请使用AddOrUpdateObjects方法。“

I.E它只能添加表格或存储过程等对象,列本身不会添加到模型中。

如果要更新现有对象(即将列添加到现有表),则需要使用“TSqlModel.AddOrUpdateObjects”,它也采用脚本名称。您可以使用以下命令从构建参与者获取脚本名称:

var sourceName = table.GetSourceInformation().SourceName;

然后你可以构建你想要的更新脚本(只是重建SQL堆栈溢出的大致概述,我相信你可以做得更好):

var sql = table.GetScript();
sql = sql.Trim().TrimEnd(')', ';') + ", rowid uniqueidentifier);";

var sourceName = table.GetSourceInformation().SourceName;
model.AddOrUpdateObjects(sql, sourceName, new TSqlObjectOptions());

有几种方法可以创建新脚本,但基本上你需要的是一个新脚本,它有你的额外列和原始表定义,你可以传递给AddorUpdateObjects来覆盖原始的create table语句。

如果您没有在AddorUpdateObjects中使用源代码,那么您可以使用部署后脚本将其添加到您需要的任何表中,然后使用部署贡献者删除删除列步骤。

您还可以考虑使用部署参与者来添加新的列步骤。

希望它有所帮助!让我知道你是怎么做的:)