public void DeleteRelation(RelationNode relationNode) { FkRelation fkRelation = relationNode.Relation as FkRelation; TableNode parentNode = null; if (fkRelation == null) { ForeignFkRelation ffkrel = relationNode.Relation as ForeignFkRelation; if (ffkrel == null) { return; } parentNode = (TableNode)this.databaseNode.FindNode(ffkrel.RelatedTable, typeof(TableNode)); relationNode = parentNode.FindRelationNode(relationNode.Text, relationNode.Parent.Text); //(RelationNode) parentNode.FindNode(relationNode.Text, typeof(RelationNode)); fkRelation = (FkRelation)relationNode.Relation; if (parentNode.Table.MappingType == TableMappingType.MappedAsIntermediateClass) { parentNode.UnmapIntermediateClass(null, EventArgs.Empty); return; } } else { parentNode = (TableNode)relationNode.Parent; } //parentNode.Nodes. Remove(relationNode); relationNode.Remove(); parentNode.Nodes.Add(relationNode.OriginalColumnNode); Debug.Assert(fkRelation != null); if (fkRelation != null) { if (fkRelation.RelationDirection != RelationDirection.DirectedFromMe) { TableNode tn = databaseNode.FindTableNode(fkRelation.RelatedTable, true); RelationNode nodeToRemove = tn.FindRelationNode(relationNode.Text, parentNode.Text); if (nodeToRemove != null) { nodeToRemove.Remove(); } } } }
public void GenerateCode(CodeTypeDeclaration persClass) { if (this.relationNode != null && (this.relation is ForeignFkRelation) && this.relationNode.RelatedTableNode.Table.Skipped) { return; } if (this.relationNode != null && this.relation.IsElement && ((TableNode)relationNode.Parent).Table.Skipped) { return; } if (this.relationNode != null && relation.IsElement && relationNode.RelatedTableNode.Table.Skipped) { return; } string typeStr; string name; bool isContainer = false; string summary = null; if (columnNode == null) // We have a relation { isContainer = !relation.IsElement; string containerType = relation.CodingStyle.ToString(); typeStr = isContainer ? containerType : relationNode.RelatedTableNode.Table.ClassName; name = relation.FieldName; } else { typeStr = columnNode.ShortType; name = columnNode.Column.FieldName; summary = columnNode.Column.Summary; } string bigname; if (name.StartsWith("_")) { bigname = name.Substring(1); } else if (name.StartsWith("m_")) { bigname = name.Substring(2); } else { bigname = name; } bigname = bigname.Substring(0, 1).ToUpper() + bigname.Substring(1); string elementTyp = null; //CodeVariableReferenceExpression fieldReference = new CodeVariableReferenceExpression("this." + name); CodeFieldReferenceExpression fieldReference = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), name); if (isContainer) { elementTyp = relationNode.RelatedTableNode.Table.ClassName; string relationName; if (relation.RelationName != string.Empty) { relationName = relation.RelationName; } else { ForeignFkRelation foreignRelation = relation as ForeignFkRelation; if (foreignRelation != null && foreignRelation.SingularFieldName != null) { relationName = foreignRelation.SingularFieldName; } else { relationName = elementTyp; } } bool isComposite = (relation.IsComposite); string parameter = elementTyp.Substring(0, 1).ToLower(); CodeMemberMethod cmm; cmm = new CodeMemberMethod(); cmm.Attributes = MemberAttributes.Public; persClass.Members.Add(cmm); if (isComposite) { cmm.Name = "New" + relationName; cmm.ReturnType = new CodeTypeReference(elementTyp); cmm.Statements.Add(new CodeVariableDeclarationStatement(elementTyp, parameter, new CodeObjectCreateExpression(elementTyp, new CodeExpression[] { }))); cmm.Statements.Add(new CodeMethodInvokeExpression(fieldReference, "Add", new CodeVariableReferenceExpression(parameter))); cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression(parameter))); } else { cmm.Name = "Add" + relationName; cmm.Parameters.Add(new CodeParameterDeclarationExpression(elementTyp, parameter)); cmm.Statements.Add(new CodeMethodInvokeExpression(fieldReference, "Add", new CodeVariableReferenceExpression(parameter))); } cmm = new CodeMemberMethod(); cmm.Attributes = MemberAttributes.Public; persClass.Members.Add(cmm); cmm.Parameters.Add(new CodeParameterDeclarationExpression(elementTyp, parameter)); cmm.Name = "Remove" + relationName; CodeConditionStatement css = new CodeConditionStatement(); css.Condition = new CodeMethodInvokeExpression(fieldReference, "Contains", new CodeVariableReferenceExpression(parameter)); css.TrueStatements.Add(new CodeMethodInvokeExpression(fieldReference, "Remove", new CodeVariableReferenceExpression(parameter))); cmm.Statements.Add(css); } CodeMemberProperty cmp = new CodeMemberProperty(); if (!string.IsNullOrEmpty(summary)) { cmp.Comments.Add(new CodeCommentStatement("<summary>", true)); cmp.Comments.Add(new CodeCommentStatement(summary, true)); cmp.Comments.Add(new CodeCommentStatement("</summary>", true)); } cmp.Attributes = MemberAttributes.Public; cmp.HasGet = true; cmp.HasSet = true; cmp.Name = bigname; cmp.SetStatements.Add(new CodeAssignStatement(fieldReference, new CodeVariableReferenceExpression("value"))); if (!isContainer) { persClass.Members.Add(cmp); cmp.Type = new CodeTypeReference(typeStr); cmp.GetStatements.Add(new CodeMethodReturnStatement(fieldReference)); } else { CodeTypeReference containerType = null; if (relation.CodingStyle == CodingStyle.IList) { containerType = new CodeTypeReference("IList"); } else { containerType = new CodeTypeReference("List"); } containerType.TypeArguments.Add(new CodeTypeReference(elementTyp)); persClass.Members.Add(cmp); cmp.Type = containerType; CodeTypeReference readOnlyList = new CodeTypeReference("NDOReadOnlyGenericList"); readOnlyList.TypeArguments.Add(elementTyp); cmp.GetStatements.Add(new CodeMethodReturnStatement(new CodeObjectCreateExpression(readOnlyList, fieldReference))); } }