Exemple #1
0
        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();
                    }
                }
            }
        }
Exemple #2
0
        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)));
            }
        }