无法在SSAS 2016中使用表格模型编程创建关系,以实现兼容性级别1200
问题描述:
我正在尝试创建一个简单的工具,可以根据元数据创建模型。我成功地创建了表格和列,但无法在模型下创建关系。当试图添加FromTable和ToTable属性到关系对象时,我得到一个错误,说这些属性是只读的,无法更改。无法在SSAS 2016中使用表格模型编程创建关系,以实现兼容性级别1200
下面是我用来创建关系的示例代码。
public void AddRelationshipsToModel()
{
OleDbDataReader reader = null;
try
{
OleDbConnection connection = new OleDbConnection();
connection.ConnectionString = metadataConnInfo.ConnectionString;
connection.Open();
OleDbCommand command = connection.CreateCommand();
command.CommandText = "select source_parent_table_name,source_parent_column_name, source_child_table_name,source_child_column_name from HX_VIEWS_RMS.BI_TABULAR_RELATIONSHIPS where MODEL_NAME='"+database.Model.Name +"'";
reader = command.ExecuteReader();
while(reader.Read())
{
string _toTable = srcAndTabularTableMap[reader.GetValue(0).ToString().Trim()];
string _toColumn = srcTableAndTabularColMap[reader.GetValue(0).ToString().Trim()][ reader.GetValue(1).ToString().Trim()];
string _fromTable = srcAndTabularTableMap[reader.GetValue(2).ToString().Trim()];
string _fromColumn = srcTableAndTabularColMap[reader.GetValue(2).ToString().Trim()][reader.GetValue(3).ToString().Trim()];
Table fromTable = Database.Model.Tables[_fromTable];
DataColumn fromColumn = (DataColumn)fromTable.Columns[_fromColumn];
Table toTable = Database.Model.Tables[_toTable];
DataColumn toColumn = (DataColumn)fromTable.Columns[_toColumn];
SingleColumnRelationship relationship = new SingleColumnRelationship();
relationship.FromTable = fromTable;
relationship.FromColumn = fromColumn;
relationship.ToTable = toTable;
relationship.ToColumn = toColumn;
//database.Model.Relationships.Add(new SingleColumnRelationship() { FromColumn = fromColumn ,ToColumn =toColumn});
}
connection.Close();
}
catch(Exception ex)
{
logger.Error(ex.Message);
}
}
答
这个blog post是一个很好的散步。
尝试设置FromColumn和ToColumn属性,而不是FromTable和ToTable设置。您也可以将它们设置为构造函数的一部分:
SingleColumnRelationship relationship = new SingleColumnRelationship()
{
FromColumn = fromColumn,
ToColumn = toColumn
};
答
表格对象模型API具有相当多的只读字段/属性。基本上他们试图告诉你,你不会直接编辑这些字段,而是让API为你填充它们。
典型的关系看起来像这样
Server = new Microsoft.AnalysisServices.Tabular.Server();
[...]
Server.Databases["MyDatabaseName"].Model.Relationships.Add(new SingleColumnRelationship
{
Name = "Relationship name",
FromColumn = Server.Databases["MyDatabaseName"].Model.Tables["FromTableName"].Columns["FromColumnName"],
FromCardinality = RelationshipEndCardinality.Many,
ToColumn = Server.Databases["MyDatabaseName"].Model.Tables["ToTableName"].Columns["ToColumnName"],
ToCardinality = RelationshipEndCardinality.One,
CrossFilteringBehavior = CrossFilteringBehavior.BothDirections,
IsActive = false
});