/// <summary>
        ///  Gets a code member field based on the provided column.
        /// </summary>
        private static CodeMemberField GetCodeMemberField(ILanguageProvider languageProvider, Smo.Column column)
        {
            var fieldName = languageProvider.GetFormattedInternalFieldName(column.Name);
            var typeName  = languageProvider.GetTypeString(column.DataType);

            return(new CodeMemberField
            {
                Name = fieldName,
                Attributes = MemberAttributes.Private,
                Type = new CodeTypeReference(typeName)
            });
        }
        /// <summary>
        /// Gets a parameter based constructor object.
        /// </summary>
        private static CodeConstructor GetParameterBasedConstructor(ILanguageProvider languageProvider, Smo.TableViewBase tableView)
        {
            var retval = new CodeConstructor {
                Attributes = MemberAttributes.Public
            };

            foreach (Smo.Column column in tableView.Columns)
            {
                var typeName            = languageProvider.GetTypeString(column.DataType);
                var fieldName           = languageProvider.GetFormattedInternalFieldName(column.Name);
                var methodParameterName = languageProvider.GetFormattedParamenterName(column.Name);

                retval.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeName), methodParameterName));
                retval.Statements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName), new CodeArgumentReferenceExpression(methodParameterName)));
            }

            return(retval);
        }
        /// <summary>
        /// Gets a code member property based on the provided column.
        /// </summary>
        private static CodeMemberProperty GetCodeMemberProperty(ILanguageProvider languageProvider, Smo.Column column)
        {
            var typeName  = languageProvider.GetTypeString(column.DataType);
            var fieldName = languageProvider.GetFormattedInternalFieldName(column.Name);
            var retval    = new CodeMemberProperty
            {
                Name       = column.Name,
                Attributes = MemberAttributes.Public | MemberAttributes.Final,
                Type       = new CodeTypeReference(typeName),
                HasGet     = true,
                HasSet     = true
            };

            retval.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName)));
            retval.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName), new CodePropertySetValueReferenceExpression()));

            return(retval);
        }
        /// <summary>
        /// Gets a "GetAll" method for the data object.
        /// </summary>
        private static CodeMemberMethod GetReadCodeMemberMethod(ILanguageProvider languageProvider, Smo.TableViewBase tableView)
        {
            var retval = new CodeMemberMethod();

            var methodName = string.Format("GetAll{0}", tableView.Name);

            retval.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            retval.Name       = methodName;
            retval.ReturnType = new CodeTypeReference("IEnumerable", new[] { new CodeTypeReference(tableView.Name) });
            retval.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference("IEnumerable", new[] { new CodeTypeReference(tableView.Name) }), "retval", new CodeObjectCreateExpression(new CodeTypeReference("List", new[] { new CodeTypeReference(tableView.Name) }))));

            var tryCatchStatement = new CodeTryCatchFinallyStatement();

            tryCatchStatement.TryStatements.Add(new CodeVariableDeclarationStatement("Database", "database", new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("DatabaseFactory"), "CreateDatabase", new CodeExpression[0])));
            tryCatchStatement.TryStatements.Add(new CodeVariableDeclarationStatement("DbCommand", "command", new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("database"), "GetStoredProcCommand", new CodeExpression[] { new CodePrimitiveExpression(methodName) })));
            tryCatchStatement.TryStatements.Add(new CodeVariableDeclarationStatement("IDataReader", "reader", new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("database"), "ExecuteReader", new CodeExpression[] { new CodeVariableReferenceExpression("command") })));

            var loopStatement = new CodeIterationStatement(new CodeSnippetStatement(""), new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeVariableReferenceExpression("reader"), "Read")), new CodeSnippetStatement(""), new CodeStatement[0]);

            var entityInstanceName = GetFormattedObjectInstanceName(tableView.Name);

            loopStatement.Statements.Add(new CodeVariableDeclarationStatement(tableView.Name, entityInstanceName, new CodeObjectCreateExpression(tableView.Name, new CodeExpression[0])));

            foreach (Smo.Column column in tableView.Columns)
            {
                loopStatement.Statements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression(entityInstanceName), column.Name), new CodeCastExpression(languageProvider.GetTypeString(column.DataType), new CodeIndexerExpression(new CodeVariableReferenceExpression("reader"), new CodeExpression[] { new CodePrimitiveExpression(column.Name) }))));
            }

            loopStatement.Statements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("retval"), "Add", new CodeExpression[] { new CodeVariableReferenceExpression(entityInstanceName) }));

            tryCatchStatement.TryStatements.Add(loopStatement);

            var catchClause = GetCatchClause();

            tryCatchStatement.CatchClauses.Add(catchClause);

            retval.Statements.Add(tryCatchStatement);
            retval.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("retval")));

            return(retval);
        }