/// <summary>
        /// Select One Query Method
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        private CodeMemberMethod BuildSelect(TableViewTableTypeBase table)
        {
            CodeMemberMethod cmSelect = new CodeMemberMethod();
            String           cp_name  = "cp_" + table.Name;

            cmSelect.Attributes = MemberAttributes.Public;
            cmSelect.Name       = "Select";
            cmSelect.Statements.Add(new CodeSnippetExpression("this.Access.CreateProcedureCommand(\"ProcedureName\")".Replace("ProcedureName", cp_name)));
            cmSelect.Statements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"Operation\", 1, ParameterDirection.Input)"));
            cmSelect.Comments.Add(new CodeCommentStatement("Selects One By Primary Key, returns a Data Set"));

            foreach (Column c in table.Columns)
            {
                if (c.InPrimaryKey)
                {
                    MemberGraph mGraph = new MemberGraph(c);
                    cmSelect.Parameters.Add(mGraph.GetParameter());
                    cmSelect.Statements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.Name + "\", " + mGraph.ParameterName() + ", ParameterDirection.Input)"));
                }
            }


            cmSelect.Statements.Add(new CodeSnippetExpression("var value = this.Access.ExecuteDataSet()"));
            cmSelect.Statements.Add(new CodeSnippetExpression("return value"));
            cmSelect.ReturnType = new CodeTypeReference("System.Data.DataSet");

            return(cmSelect);
        }
        public CodeTypeDeclaration BuildPoc(TableViewBase rootModel)
        {
            CodeTypeDeclaration ctd = new CodeTypeDeclaration();
            ConstructorGraph ctorGraph = new ConstructorGraph();

            ctd.Name = rootModel.Name;
            ctd.TypeAttributes = System.Reflection.TypeAttributes.Public;
            ctd.Attributes = MemberAttributes.Public;
            ctd.IsPartial = true;
            CodeAttributeDeclaration cad_DataContract = new CodeAttributeDeclaration(" System.Runtime.Serialization.DataContractAttribute");
            ctd.CustomAttributes.Add(cad_DataContract);

            // Members
            foreach (Column c in rootModel.Columns)
            {
                MemberGraph mGraph = new MemberGraph(c);

                CodeMemberField c_field = mGraph.GetField();
                CodeMemberProperty c_prop = mGraph.GetProperty();

                CodeAttributeDeclaration cad_DataMember = new CodeAttributeDeclaration("System.Runtime.Serialization.DataMemberAttribute");
                c_prop.CustomAttributes.Add(cad_DataMember);

                ctd.Members.Add(c_field);
                ctd.Members.Add(c_prop);
            }

            foreach (CodeConstructor cc in ctorGraph.GraphConstructors(rootModel))
            {
                ctd.Members.Add(cc);
            }

            return ctd;
        }
        /// <summary>
        /// Delete Query Method
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        private CodeMemberMethod BuildDelete(TableViewTableTypeBase table)
        {
            CodeMemberMethod cmDelete = new CodeMemberMethod();

            cmDelete.Attributes = MemberAttributes.Public;
            cmDelete.Name       = "Delete";
            String cp_name = "cp_" + table.Name;

            cmDelete.ReturnType = new CodeTypeReference("System.Int32");
            cmDelete.Statements.Add(new CodeSnippetExpression("this.Access.CreateProcedureCommand(\"ProcedureName\")".Replace("ProcedureName", cp_name)));
            cmDelete.Statements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"Operation\", 6, ParameterDirection.Input)"));
            foreach (Column c in table.Columns)
            {
                if (c.InPrimaryKey)
                {
                    MemberGraph mGraph = new MemberGraph(c);
                    cmDelete.Parameters.Add(mGraph.GetParameter());
                    cmDelete.Statements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.PropertyName() + "\", " + mGraph.ParameterName() + ", ParameterDirection.Input)"));
                }
            }

            cmDelete.Statements.Add(new CodeSnippetExpression("var value = this.Access.ExecuteNonQuery()"));
            cmDelete.Statements.Add(new CodeSnippetExpression("return value"));
            cmDelete.Comments.Add(new CodeCommentStatement("Delete's a record"));

            return(cmDelete);
        }
        public CodeTypeDeclaration BuildPoco(View view)
        {
            CodeTypeDeclaration ctd       = new CodeTypeDeclaration();
            ConstructorGraph    ctorGraph = new ConstructorGraph();

            ctd.Name           = view.Name;
            ctd.TypeAttributes = System.Reflection.TypeAttributes.Public;
            ctd.Attributes     = MemberAttributes.Public;
            ctd.IsPartial      = true;

            // Members
            foreach (Column c in view.Columns)
            {
                MemberGraph mGraph = new MemberGraph(c);
                ctd.Members.Add(mGraph.GetField());
                ctd.Members.Add(mGraph.GetProperty());
            }

            // View only Gets One Constructor
            ctd.Members.Add(ctorGraph.GraphConstructors(view)[0]);

            ctd.Members.AddRange(AddMethods(view));

            return(ctd);
        }
        public CodeTypeDeclaration BuildPoc(TableViewBase rootModel)
        {
            CodeTypeDeclaration ctd       = new CodeTypeDeclaration();
            ConstructorGraph    ctorGraph = new ConstructorGraph();

            ctd.Name           = rootModel.Name;
            ctd.TypeAttributes = System.Reflection.TypeAttributes.Public;
            ctd.Attributes     = MemberAttributes.Public;
            ctd.IsPartial      = true;
            CodeAttributeDeclaration cad_DataContract = new CodeAttributeDeclaration(" System.Runtime.Serialization.DataContractAttribute");

            ctd.CustomAttributes.Add(cad_DataContract);

            // Members
            foreach (Column c in rootModel.Columns)
            {
                MemberGraph mGraph = new MemberGraph(c);

                CodeMemberField    c_field = mGraph.GetField();
                CodeMemberProperty c_prop  = mGraph.GetProperty();

                CodeAttributeDeclaration cad_DataMember = new CodeAttributeDeclaration("System.Runtime.Serialization.DataMemberAttribute");
                c_prop.CustomAttributes.Add(cad_DataMember);

                ctd.Members.Add(c_field);
                ctd.Members.Add(c_prop);
            }

            foreach (CodeConstructor cc in ctorGraph.GraphConstructors(rootModel))
            {
                ctd.Members.Add(cc);
            }

            return(ctd);
        }
        public CodeTypeDeclaration BuildPoco(Table table)
        {
            CodeTypeDeclaration ctd       = new CodeTypeDeclaration();
            ConstructorGraph    ctorGraph = new ConstructorGraph();

            ctd.Name           = table.Name;
            ctd.TypeAttributes = System.Reflection.TypeAttributes.Public;
            ctd.Attributes     = MemberAttributes.Public;
            ctd.IsPartial      = true;

            // Members
            foreach (Column c in table.Columns)
            {
                MemberGraph mGraph = new MemberGraph(c);
                ctd.Members.Add(mGraph.GetField());
                ctd.Members.Add(mGraph.GetProperty());
            }

            foreach (CodeConstructor cc in ctorGraph.GraphConstructors(table))
            {
                ctd.Members.Add(cc);
            }

            ctd.Members.AddRange(AddMethods(table));
            return(ctd);
        }
        private CodeMemberMethod BuildFillMethod(TableViewTableTypeBase table)
        {
            // Accepts a DataRow and Returns a Poco of this type.
            CodeMemberMethod cmmFill = new CodeMemberMethod();

            cmmFill.Name       = "Fill";
            cmmFill.Attributes = MemberAttributes.Private;
            cmmFill.ReturnType = new CodeTypeReference(table.Name);
            CodeParameterDeclarationExpression cpdeDataRow = new CodeParameterDeclarationExpression();

            cpdeDataRow.Name      = "row";
            cpdeDataRow.Type      = new CodeTypeReference("System.Data.DataRow");
            cpdeDataRow.Direction = FieldDirection.In;

            cmmFill.Parameters.Add(cpdeDataRow);
            var init_Express = new CodeSnippetExpression("new " + table.Name + "()");

            var obj = new CodeVariableDeclarationStatement(new CodeTypeReference(table.Name), "obj", init_Express);

            cmmFill.Statements.Add(obj);

            foreach (Column c in table.Columns)
            {
                String      DotNetTypeName = TypeConvertor.ToNetType(c.DataType.SqlDataType).ToString();
                MemberGraph mGraph         = new MemberGraph(c);
                System.CodeDom.CodeConditionStatement ccsField = new CodeConditionStatement();
                ccsField.Condition = new CodeSnippetExpression("(row[\"" + c.Name + "\"] != System.DBNull.Value)");
                //if (!(mGraph.IsReadOnly))
                //{
                // If Field is nullable Type
                if (mGraph.IsNullable)
                {
                    if (mGraph.TypeName() == "String")
                    {
                        ccsField.TrueStatements.Add(new CodeSnippetExpression("obj." + mGraph.PropertyName() + " = row[\"" + c.Name + "\"].ToString()"));
                    }
                    else
                    {
                        ccsField.TrueStatements.Add(new CodeSnippetExpression("obj." + mGraph.PropertyName() + " = ((" + mGraph.TypeName() + ")(row[\"" + c.Name + "\"]))"));
                    }
                }
                else
                {
                    if (mGraph.TypeName() == "String")
                    {
                        ccsField.TrueStatements.Add(new CodeSnippetExpression("obj." + mGraph.PropertyName() + " = row[\"" + c.Name + "\"].ToString()"));
                    }
                    else
                    {
                        ccsField.TrueStatements.Add(new CodeSnippetExpression("obj." + mGraph.PropertyName() + " = ((" + mGraph.TypeName() + ")(row[\"" + c.Name + "\"]))"));
                    }
                }
                cmmFill.Statements.Add(ccsField);
                //}
            }

            cmmFill.Statements.Add(new CodeSnippetExpression("return obj"));
            cmmFill.Comments.Add(new CodeCommentStatement("Returns a Hydrated POCO"));
            return(cmmFill);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        public CodeMemberMethod BuildSelectBE(TableViewTableTypeBase table)
        {
            CodeMemberMethod cmSelect = new CodeMemberMethod();

            cmSelect.Attributes = MemberAttributes.Public;
            cmSelect.ReturnType = new CodeTypeReference("System.Data.DataSet");
            String cp_name          = "ssp_" + table.Name;
            String PocoTypeName     = table.Name;
            String FullPocoTypeName = PocoTypeName;

            CodeParameterDeclarationExpression cpdePoco = new CodeParameterDeclarationExpression();

            cpdePoco.Name      = "query";
            cpdePoco.Type      = new CodeTypeReference(table.Name);
            cpdePoco.Direction = FieldDirection.In;
            cmSelect.Parameters.Add(cpdePoco);
            cmSelect.Attributes = MemberAttributes.Public;
            cmSelect.Name       = "Select";
            cmSelect.Statements.Add(new CodeSnippetExpression("this.Access.CreateProcedureCommand(\"" + cp_name + "\")"));

            foreach (Column c in table.Columns)
            {
                MemberGraph mGraph         = new MemberGraph(c);
                String      DotNetTypeName = TypeConvertor.ToNetType(c.DataType.SqlDataType).ToString();

                System.CodeDom.CodeConditionStatement ccsField = new CodeConditionStatement();
                if (mGraph.IsNullable)
                {
                    ccsField.Condition = new CodeSnippetExpression("query." + mGraph.PropertyName() + ".HasValue");
                    ccsField.TrueStatements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.PropertyName() + "\",query." + mGraph.PropertyName() + ".Value, ParameterDirection.Input)"));
                    ccsField.FalseStatements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.PropertyName() + "\", null , ParameterDirection.Input)"));
                }
                else
                {
                    ccsField.Condition = new CodeSnippetExpression("query." + mGraph.PropertyName() + " == null");
                    ccsField.TrueStatements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.PropertyName() + "\", null , ParameterDirection.Input)"));
                    ccsField.FalseStatements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.PropertyName() + "\",query." + mGraph.PropertyName() + ", ParameterDirection.Input)"));
                }

                cmSelect.Statements.Add(ccsField);
            }

            cmSelect.Statements.Add(new CodeSnippetExpression("return this.Access.ExecuteDataSet()"));
            cmSelect.Comments.Add(new CodeCommentStatement("Select by Object [Implements Query By Example], returns DataSet"));
            return(cmSelect);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        public CodeMemberMethod BuildSelectBE(TableViewTableTypeBase table)
        {
            CodeMemberMethod cmSelect = new CodeMemberMethod();
            cmSelect.Attributes = MemberAttributes.Public;
            cmSelect.ReturnType = new CodeTypeReference("System.Data.DataSet");
            String cp_name = "ssp_" + table.Name;
            String PocoTypeName = table.Name;
            String FullPocoTypeName = PocoTypeName;

            CodeParameterDeclarationExpression cpdePoco = new CodeParameterDeclarationExpression();
            cpdePoco.Name = "query";
            cpdePoco.Type = new CodeTypeReference(table.Name);
            cpdePoco.Direction = FieldDirection.In;
            cmSelect.Parameters.Add(cpdePoco);
            cmSelect.Attributes = MemberAttributes.Public;
            cmSelect.Name = "Select";
            cmSelect.Statements.Add(new CodeSnippetExpression("this.Access.CreateProcedureCommand(\"" + cp_name + "\")"));

            foreach (Column c in table.Columns)
            {
                MemberGraph mGraph = new MemberGraph(c);
                String DotNetTypeName = TypeConvertor.ToNetType(c.DataType.SqlDataType).ToString();

                System.CodeDom.CodeConditionStatement ccsField = new CodeConditionStatement();
                if (mGraph.IsNullable)
                {
                    ccsField.Condition = new CodeSnippetExpression("query." + mGraph.PropertyName() + ".HasValue");
                    ccsField.TrueStatements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.PropertyName() + "\",query." + mGraph.PropertyName() + ".Value, ParameterDirection.Input)"));
                    ccsField.FalseStatements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.PropertyName() + "\", null , ParameterDirection.Input)"));
                }
                else
                {
                    ccsField.Condition = new CodeSnippetExpression("query." + mGraph.PropertyName() + " == null");
                    ccsField.TrueStatements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.PropertyName() + "\", null , ParameterDirection.Input)"));
                    ccsField.FalseStatements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.PropertyName() + "\",query." + mGraph.PropertyName() + ", ParameterDirection.Input)"));
                }

                cmSelect.Statements.Add(ccsField);
            }

            cmSelect.Statements.Add(new CodeSnippetExpression("return this.Access.ExecuteDataSet()"));
            cmSelect.Comments.Add(new CodeCommentStatement("Select by Object [Implements Query By Example], returns DataSet"));
            return cmSelect;
        }
        /// <summary>
        /// Insert Query Method
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        private CodeMemberMethod BuildInsert(TableViewTableTypeBase table)
        {
            CodeMemberMethod cmInsert = new CodeMemberMethod();

            cmInsert.Name = "Insert";
            String cp_name = "cp_" + table.Name;

            cmInsert.Attributes = MemberAttributes.Public;
            cmInsert.ReturnType = new CodeTypeReference("System.Int32");

            foreach (Column c in table.Columns)
            {
                MemberGraph mGraph = new MemberGraph(c);
                if (mGraph.IsReadOnly)
                {
                    // nothing yet
                }
                else
                {
                    cmInsert.Parameters.Add(mGraph.GetParameter());
                }
            }

            cmInsert.Statements.Add(new CodeSnippetExpression("this.Access.CreateProcedureCommand(\"ProcedureName\")".Replace("ProcedureName", cp_name)));
            cmInsert.Statements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"Operation\", 5, ParameterDirection.Input)"));

            foreach (Column c in table.Columns)
            {
                MemberGraph mGraph = new MemberGraph(c);
                if (mGraph.IsReadOnly)
                {
                    // nothing yet
                }
                else
                {
                    cmInsert.Statements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.PropertyName() + "\", " + mGraph.ParameterName() + " , ParameterDirection.Input)"));
                }
            }

            cmInsert.Statements.Add(new CodeSnippetExpression("return this.Access.ExecuteNonQuery()"));
            cmInsert.Comments.Add(new CodeCommentStatement("Inserts a record"));
            return(cmInsert);
        }
        public CodeTypeDeclaration BuildPoco(View view)
        {
            CodeTypeDeclaration ctd = new CodeTypeDeclaration();
            ConstructorGraph ctorGraph = new ConstructorGraph();

            ctd.Name = view.Name;
            ctd.TypeAttributes = System.Reflection.TypeAttributes.Public;
            ctd.Attributes = MemberAttributes.Public;
            ctd.IsPartial = true;

            // Members
            foreach (Column c in view.Columns)
            {
                MemberGraph mGraph = new MemberGraph(c);
                ctd.Members.Add(mGraph.GetField());
                ctd.Members.Add(mGraph.GetProperty());
            }

            // View only Gets One Constructor
            ctd.Members.Add(ctorGraph.GraphConstructors(view)[0]);

            ctd.Members.AddRange(AddMethods(view));

            return ctd;
        }
        private CodeMemberMethod BuildPocoDelete(TableViewTableTypeBase table)
        {
            CodeMemberMethod cmDelete = new CodeMemberMethod();
            cmDelete.Attributes = MemberAttributes.Public;
            cmDelete.Name = "Delete";
            String cp_name = "cp_" + table.Name;
            cmDelete.Parameters.Add(this.PocoQueryParameter(table.Name));
            cmDelete.ReturnType = new CodeTypeReference("System.Int32");
            cmDelete.Statements.Add(new CodeSnippetExpression("this.Access.CreateProcedureCommand(\"ProcedureName\")".Replace("ProcedureName", cp_name)));
            cmDelete.Statements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"Operation\", 6, ParameterDirection.Input)"));

            foreach (Column c in table.Columns)
            {
                if (c.InPrimaryKey)
                {
                    MemberGraph mGraph = new MemberGraph(c);
                    if (mGraph.IsNullable)
                    {

                        cmDelete.Statements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.PropertyName() + "\", query." + mGraph.PropertyName() + ".Value, ParameterDirection.Input)"));
                    }
                    else
                    {
                        cmDelete.Statements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.PropertyName() + "\", query." + mGraph.PropertyName() + ", ParameterDirection.Input)"));
                    }
                }
            }

            cmDelete.Statements.Add(new CodeSnippetExpression("var value = this.Access.ExecuteNonQuery()"));
            cmDelete.Statements.Add(new CodeSnippetExpression("return value"));
            cmDelete.Comments.Add(new CodeCommentStatement("Delete's a record"));

            return cmDelete;
        }
        /// <summary>
        /// Update Query Method
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        private CodeMemberMethod BuildUpdate(TableViewTableTypeBase table)
        {
            CodeMemberMethod cmUpdate = new CodeMemberMethod();
            cmUpdate.Attributes = MemberAttributes.Public;
            cmUpdate.Name = "Update";
            String cp_name = "cp_" + table.Name;

            foreach (Column c in table.Columns)
            {
                MemberGraph mGraph = new MemberGraph(c);
                if (mGraph.IsReadOnly)
                {
                    // nothing yet
                }
                else
                {
                    cmUpdate.Parameters.Add(mGraph.GetParameter());
                }
            }

            cmUpdate.Statements.Add(new CodeSnippetExpression("this.Access.CreateProcedureCommand(\"ProcedureName\")".Replace("ProcedureName", cp_name)));
            cmUpdate.Statements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"Operation\", 4, ParameterDirection.Input)"));

            foreach (Column c in table.Columns)
            {
                MemberGraph mGraph = new MemberGraph(c);
                if (mGraph.IsReadOnly)
                {
                    // nothing yet
                }
                else
                {
                    cmUpdate.Statements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.PropertyName() + "\", " + mGraph.ParameterName() + ", ParameterDirection.Input)"));
                }
            }

            cmUpdate.Statements.Add(new CodeSnippetExpression("var value  = this.Access.ExecuteNonQuery()"));
            cmUpdate.Statements.Add(new CodeSnippetExpression("return value"));
            cmUpdate.ReturnType = new CodeTypeReference("System.Int32");
            cmUpdate.Comments.Add(new CodeCommentStatement("Updates a Record"));
            return cmUpdate;
        }
        /// <summary>
        /// Select One Query Method
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        private CodeMemberMethod BuildSelect(TableViewTableTypeBase table)
        {
            CodeMemberMethod cmSelect = new CodeMemberMethod();
            String cp_name = "cp_" + table.Name;
            cmSelect.Attributes = MemberAttributes.Public;
            cmSelect.Name = "Select";
            cmSelect.Statements.Add(new CodeSnippetExpression("this.Access.CreateProcedureCommand(\"ProcedureName\")".Replace("ProcedureName",cp_name)));
            cmSelect.Statements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"Operation\", 1, ParameterDirection.Input)"));
            cmSelect.Comments.Add(new CodeCommentStatement("Selects One By Primary Key, returns a Data Set"));

            foreach (Column c in table.Columns)
            {
                if (c.InPrimaryKey)
                {
                    MemberGraph mGraph = new MemberGraph(c);
                    cmSelect.Parameters.Add(mGraph.GetParameter());
                    cmSelect.Statements.Add(new CodeSnippetExpression("this.Access.AddParameter(\"" + mGraph.Name + "\", " + mGraph.ParameterName() + ", ParameterDirection.Input)"));
                }
            }

            cmSelect.Statements.Add(new CodeSnippetExpression("var value = this.Access.ExecuteDataSet()"));
            cmSelect.Statements.Add(new CodeSnippetExpression("return value"));
            cmSelect.ReturnType = new CodeTypeReference("System.Data.DataSet");

            return cmSelect;
        }
        public CodeTypeDeclaration BuildPoco(Table table)
        {
            CodeTypeDeclaration ctd     = new CodeTypeDeclaration();
            ConstructorGraph ctorGraph  = new ConstructorGraph();

            ctd.Name            = table.Name;
            ctd.TypeAttributes  = System.Reflection.TypeAttributes.Public;
            ctd.Attributes      = MemberAttributes.Public;
            ctd.IsPartial       = true;

            // Members
            foreach (Column c in table.Columns)
            {
                MemberGraph mGraph = new MemberGraph(c);
                ctd.Members.Add(mGraph.GetField());
                ctd.Members.Add(mGraph.GetProperty());
            }

            foreach (CodeConstructor cc in ctorGraph.GraphConstructors(table))
            {
                ctd.Members.Add(cc);
            }

            ctd.Members.AddRange(AddMethods(table));
            return ctd;
        }
        private MemberGraph CreateGraph(IEnumerable<TypeViewModel> typeViewModels)
        {
            var graph = new MemberGraph(true);
            var types = typeViewModels.Select(vm => vm.TypeInfo).ToArray();

            foreach (var typeViewModel in typeViewModels)
            {
                var type = typeViewModel.TypeInfo;
                var methods = type.Methods.Where(m => !m.Name.StartsWith("<")).Concat(type.Accessors);
                if (!typeViewModel.ShowInternals)
                {
                    methods = methods.Where(m => m.IsVisibleOutside());
                }

                if (!ShowStaticConstructors)
                {
                    methods = methods.Where(m => m.Name != ".cctor");
                }

                foreach (var method in methods)
                {
                    var mvm = GetViewModelForMethod(method);
                    if (!graph.ContainsVertex(mvm))
                    {
                        graph.AddVertex(mvm);
                    }

                    var usedMethodsRaw = Helper.GetUsedMethods(method.MemberReference).ToArray();
                    var usedMethods = FixDeclaringTypes(usedMethodsRaw, types)
                        .Where(m => typeViewModels.Any(t => (m.IsVisibleOutside() || t.ShowInternals)) && !m.Name.StartsWith("<"))
                        .ToArray();
                    foreach (var usedMethod in usedMethods)
                    {
                        var vm = GetViewModelForMethod(usedMethod);
                        if (!graph.ContainsVertex(vm))
                        {
                            graph.AddVertex(vm);
                        }
                        graph.AddEdge(new Edge<MemberViewModel>(mvm, vm));
                    }

                    var usedFieldsRaw = Helper.GetUsedFields(method.MemberReference).ToArray();
                    var usedFields = FixDeclaringTypes(usedFieldsRaw, types)
                        .Where(m => typeViewModels.Any(
                            tvm => (m.IsVisibleOutside() || tvm.ShowInternals)) && !m.Name.StartsWith("CS$") && !m.Name.EndsWith("k__BackingField"))
                        .ToArray();
                    foreach (var usedField in usedFields)
                    {
                        var vm = GetViewModelForField(usedField);
                        if (!graph.ContainsVertex(vm))
                        {
                            graph.AddVertex(vm);
                        }
                        graph.AddEdge(new Edge<MemberViewModel>(mvm, vm));
                    }
                }
            }

            if (!ShowUnconnectedVertices)
            {
                graph.RemoveVertexIf(v => graph.Degree(v) == 0);
            }

            return graph;
        }
        private CodeMemberMethod BuildFillMethod(TableViewTableTypeBase table)
        {
            // Accepts a DataRow and Returns a Poco of this type.
            CodeMemberMethod cmmFill = new CodeMemberMethod();
            cmmFill.Name = "Fill";
            cmmFill.Attributes = MemberAttributes.Private;
            cmmFill.ReturnType = new CodeTypeReference(table.Name);
            CodeParameterDeclarationExpression cpdeDataRow = new CodeParameterDeclarationExpression();
            cpdeDataRow.Name = "row";
            cpdeDataRow.Type = new CodeTypeReference("System.Data.DataRow");
            cpdeDataRow.Direction = FieldDirection.In;

            cmmFill.Parameters.Add(cpdeDataRow);
            var init_Express = new CodeSnippetExpression("new " + table.Name + "()");

            var obj = new CodeVariableDeclarationStatement(new CodeTypeReference(table.Name), "obj", init_Express);
            cmmFill.Statements.Add(obj);

            foreach (Column c in table.Columns)
            {
                String DotNetTypeName = TypeConvertor.ToNetType(c.DataType.SqlDataType).ToString();
                MemberGraph mGraph = new MemberGraph(c);
                System.CodeDom.CodeConditionStatement ccsField = new CodeConditionStatement();
                ccsField.Condition = new CodeSnippetExpression("(row[\"" + c.Name + "\"] != System.DBNull.Value)");
                //if (!(mGraph.IsReadOnly))
                //{
                    // If Field is nullable Type
                    if (mGraph.IsNullable)
                    {
                        if (mGraph.TypeName() == "String")
                        {
                            ccsField.TrueStatements.Add(new CodeSnippetExpression("obj." + mGraph.PropertyName() + " = row[\"" + c.Name + "\"].ToString()"));
                        }
                        else
                        {
                            ccsField.TrueStatements.Add(new CodeSnippetExpression("obj." + mGraph.PropertyName() + " = ((" + mGraph.TypeName() + ")(row[\"" + c.Name + "\"]))"));
                        }
                    }
                    else
                    {
                        if (mGraph.TypeName() == "String")
                        {
                             ccsField.TrueStatements.Add(new CodeSnippetExpression("obj." + mGraph.PropertyName() + " = row[\"" + c.Name + "\"].ToString()"));
                        }
                        else
                        {
                            ccsField.TrueStatements.Add(new CodeSnippetExpression("obj." + mGraph.PropertyName() + " = ((" + mGraph.TypeName() + ")(row[\"" + c.Name + "\"]))"));
                        }
                    }
                    cmmFill.Statements.Add(ccsField);
                //}
            }

            cmmFill.Statements.Add(new CodeSnippetExpression("return obj"));
            cmmFill.Comments.Add(new CodeCommentStatement("Returns a Hydrated POCO"));
            return cmmFill;
        }