我想在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
。
答案 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中使用源代码,那么您可以使用部署后脚本将其添加到您需要的任何表中,然后使用部署贡献者删除删除列步骤。
您还可以考虑使用部署参与者来添加新的列步骤。
希望它有所帮助!让我知道你是怎么做的:)