0

I am trying to create a simple tool that creates a model from metadata. I am successful in creating tables and columns, but unable to create relationships under model. While trying to add FromTable and ToTable properties to relationship object i was getting an error saying those properties are read-only and cannot be changed.

Below is the sample code that i am using to create relationships.

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);
        }
    }

3 Answers3

1

This blog post is a good walk through.

Try just setting the FromColumn and ToColumn properties not the FromTable and ToTable settings. Optionally you can set them as part of the constructor:

SingleColumnRelationship relationship = new SingleColumnRelationship()
{
                FromColumn = fromColumn,
                ToColumn = toColumn
};
GregGalloway
  • 11,355
  • 3
  • 16
  • 47
0

Tabular object model API has quite a few readonly fields / properties. Basically they are trying to tell you that you are not suppose to edit these fields directly but rather let API fill them for you.

Typical relationship look like this

                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
                });
RassaR
  • 133
  • 8
0

Try to handle with this class - Microsoft.AnalysisServices.Tabular.SingleColumnRelationship