无法在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 
       });