/// <summary> /// Adds the relationship. /// </summary> /// <param name="isForward">if set to <c>true</c> [is forward].</param> private void AddRelationship(bool isForward) { long id; if (IsEntityValid(SelectedText, out id)) { AddRelationshipDialog dialog = new AddRelationshipDialog(PluginSettings, id, isForward); var result = dialog.ShowDialog( ); if (result == true) { AddRelationshipDialogViewModel vm = dialog.DataContext as AddRelationshipDialogViewModel; if (vm != null) { RelationshipPicker selectedRelationship = vm.SelectedRelationship; if (selectedRelationship != null && selectedRelationship.SelectedInstance != null) { var instance = selectedRelationship.SelectedInstance; var dbManager = new DatabaseManager(PluginSettings.DatabaseSettings); string commandText = @"--ReadiMon: Insert Relationship DECLARE @contextInfo VARBINARY(128) = CONVERT( VARBINARY(128), 'Entity Browser->Add Relationship' ) SET CONTEXT_INFO @contextInfo INSERT INTO Relationship (TenantId, TypeId, FromId, ToId) VALUES (@tenantId, @typeId, @fromId, @toId)"; using (var command = dbManager.CreateCommand(commandText)) { dbManager.AddParameter(command, "@tenantId", selectedRelationship.TenantId); dbManager.AddParameter(command, "@typeId", selectedRelationship.Id); dbManager.AddParameter(command, "@fromId", selectedRelationship.IsForward ? SelectedEntityId : instance.Id); dbManager.AddParameter(command, "@toId", selectedRelationship.IsForward ? instance.Id : SelectedEntityId); command.ExecuteNonQuery( ); LoadEntity(SelectedText, true); } } } } } }
/// <summary> /// Loads the fields. /// </summary> private void LoadRelationships( ) { var dbManager = new DatabaseManager(PluginSettings.DatabaseSettings); string commandText; if (IsForward) { commandText = @"-- ReadiMon: GetForwardRelationships SET NOCOUNT ON DECLARE @tenantId BIGINT SELECT @tenantId = TenantId FROM Entity WHERE Id = @entityId DECLARE @isOfType BIGINT = dbo.fnAliasNsId( 'isOfType', 'core', @tenantId ) DECLARE @inherits BIGINT = dbo.fnAliasNsId( 'inherits', 'core', @tenantId ) DECLARE @from BIGINT = dbo.fnAliasNsId( 'fromType', 'core', @tenantId ) DECLARE @to BIGINT = dbo.fnAliasNsId( 'toType', 'core', @tenantId ) DECLARE @name BIGINT = dbo.fnAliasNsId( 'name', 'core', @tenantId ) DECLARE @alias BIGINT = dbo.fnAliasNsId( 'alias', 'core', @tenantId ) DECLARE @description BIGINT = dbo.fnAliasNsId( 'description', 'core', @tenantId ) DECLARE @cardinality BIGINT = dbo.fnAliasNsId( 'cardinality', 'core', @tenantId ) DECLARE @typeId BIGINT SELECT @typeId = ToId FROM Relationship WHERE TenantId = @tenantId AND FromId = @entityId AND TypeId = @isOfType SELECT DISTINCT [TenantId] = @tenantId, [TypeId] = r.FromId, [TypeUpgradeId] = e.UpgradeId, [Name] = n.Data, [Description] = d.Data, [FromId] = r.ToId, [From] = yna.Data, [ToId] = o.ToId, [To] = xna.Data, [Cardinality] = ca.Data, [Alias] = ta.Namespace + ':' + ta.Data FROM dbo.fnAncestorsAndSelf( @inherits, @typeId, @tenantId ) a JOIN Relationship r ON r.TenantId = @tenantId AND r.ToId = a.Id AND r.TypeId = @from JOIN Relationship o ON o.TenantId = @tenantId AND r.FromId = o.FromId AND o.TypeId = @to LEFT JOIN Data_Alias ta ON ta.TenantId = @tenantId AND r.FromId = ta.EntityId AND ta.FieldId = @alias AND ta.AliasMarkerId = 0 LEFT JOIN Data_NVarChar xna ON xna.TenantId = @tenantId AND o.ToId = xna.EntityId AND xna.FieldId = @name LEFT JOIN Data_NVarChar yna ON yna.TenantId = @tenantId AND r.ToId = yna.EntityId AND yna.FieldId = @name LEFT JOIN Relationship c ON r.TenantId = c.TenantId AND r.FromId = c.FromId AND c.TypeId = @cardinality LEFT JOIN Data_Alias ca ON r.TenantId = ca.TenantId AND ca.EntityId = c.ToId AND ca.FieldId = @alias JOIN Entity e ON r.FromId = e.Id AND e.TenantId = @tenantId LEFT JOIN Data_NVarChar n ON n.TenantId = @tenantId AND r.FromId = n.EntityId AND n.FieldId = @name LEFT JOIN Data_NVarChar d ON d.TenantId = @tenantId AND r.FromId = d.EntityId AND d.FieldId = @description ORDER BY n.Data SELECT TenantId, TypeId, FromId, ToId FROM Relationship WHERE TenantId = @tenantId AND FromId = @entityId" ; } else { commandText = @"-- ReadiMon: GetReverseRelationships SET NOCOUNT ON DECLARE @tenantId BIGINT SELECT @tenantId = TenantId FROM Entity WHERE Id = @entityId DECLARE @isOfType BIGINT = dbo.fnAliasNsId( 'isOfType', 'core', @tenantId ) DECLARE @inherits BIGINT = dbo.fnAliasNsId( 'inherits', 'core', @tenantId ) DECLARE @from BIGINT = dbo.fnAliasNsId( 'fromType', 'core', @tenantId ) DECLARE @to BIGINT = dbo.fnAliasNsId( 'toType', 'core', @tenantId ) DECLARE @name BIGINT = dbo.fnAliasNsId( 'name', 'core', @tenantId ) DECLARE @alias BIGINT = dbo.fnAliasNsId( 'alias', 'core', @tenantId ) DECLARE @reverseAlias BIGINT = dbo.fnAliasNsId( 'reverseAlias', 'core', @tenantId ) DECLARE @description BIGINT = dbo.fnAliasNsId( 'description', 'core', @tenantId ) DECLARE @cardinality BIGINT = dbo.fnAliasNsId( 'cardinality', 'core', @tenantId ) DECLARE @typeId BIGINT SELECT @typeId = ToId FROM Relationship WHERE TenantId = @tenantId AND FromId = @entityId AND TypeId = @isOfType SELECT DISTINCT [TenantId] = @tenantId, [TypeId] = r.FromId, [TypeUpgradeId] = e.UpgradeId, [Name] = n.Data, [Description] = d.Data, [FromId] = o.ToId, [From] = xna.Data, [ToId] = r.ToId, [To] = yna.Data, [Cardinality] = ca.Data, [Alias] = ta.Namespace + ':' + ta.Data FROM dbo.fnAncestorsAndSelf( @inherits, @typeId, @tenantId ) a JOIN Relationship r ON r.TenantId = @tenantId AND r.ToId = a.Id AND r.TypeId = @to JOIN Relationship o ON o.TenantId = @tenantId AND r.FromId = o.FromId AND o.TypeId = @from LEFT JOIN Data_Alias ta ON ta.TenantId = @tenantId AND r.FromId = ta.EntityId AND ta.FieldId = @reverseAlias AND ta.AliasMarkerId = 1 LEFT JOIN Data_NVarChar xna ON xna.TenantId = @tenantId AND o.ToId = xna.EntityId AND xna.FieldId = @name LEFT JOIN Data_NVarChar yna ON yna.TenantId = @tenantId AND r.ToId = yna.EntityId AND yna.FieldId = @name LEFT JOIN Relationship c ON r.TenantId = c.TenantId AND r.FromId = c.FromId AND c.TypeId = @cardinality LEFT JOIN Data_Alias ca ON r.TenantId = ca.TenantId AND ca.EntityId = c.ToId AND ca.FieldId = @alias JOIN Entity e ON r.FromId = e.Id AND e.TenantId = @tenantId LEFT JOIN Data_NVarChar n ON n.TenantId = @tenantId AND r.FromId = n.EntityId AND n.FieldId = @name LEFT JOIN Data_NVarChar d ON d.TenantId = @tenantId AND r.FromId = d.EntityId AND d.FieldId = @description ORDER BY n.Data SELECT TenantId, TypeId, FromId, ToId FROM Relationship WHERE TenantId = @tenantId AND ToId = @entityId" ; } var command = dbManager.CreateCommand(commandText); dbManager.AddParameter(command, "@entityId", SelectedEntityId); using (IDataReader reader = command.ExecuteReader( )) { var relationships = new List <RelationshipPicker>( ); Dictionary <long, RelationshipPicker> map = new Dictionary <long, RelationshipPicker>( ); while (reader.Read( )) { var tenantId = reader.GetInt64(0); var id = reader.GetInt64(1); var upgradeId = reader.GetGuid(2); var name = reader.GetString(3, "<Unnamed>"); var description = reader.GetString(4, "No description specified"); var fromId = reader.GetInt64(5); var from = reader.GetString(6, "<Unnamed>"); var toId = reader.GetInt64(7); var to = reader.GetString(8, "<Unnamed>"); var cardinality = reader.GetString(9, null); var alias = reader.GetString(10, null); RelationshipPicker rel = new RelationshipPicker(id, tenantId, upgradeId, name + (alias == null ? "" : $" - ({alias})"), description, fromId, from, toId, to, cardinality, IsForward, PluginSettings); relationships.Add(rel); map[rel.Id] = rel; } if (reader.NextResult( )) { while (reader.Read( )) { var existingRelationshipId = reader.GetInt64(1); RelationshipPicker relationship; if (map.TryGetValue(existingRelationshipId, out relationship)) { if (relationship.Cardinality == "oneToOne" || relationship.Cardinality == "oneToMany") { relationship.Disabled = true; } } } } Relationships = relationships; } }