Exemplo n.º 1
0
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="table">Tabela que a coluna está contida.</param>
 /// <param name="columnName"></param>
 public FieldMap(TableMap table, string columnName)
 {
     _table      = table;
     _columnName = columnName;
 }
Exemplo n.º 2
0
        /// <summary>
        /// Gera o código do mapeamento.
        /// </summary>
        /// <param name="map">Dados do mapeamento.</param>
        /// <param name="baseTypeName">Tipo base da model a ser criada.</param>
        /// <param name="outStream">Sream onde sera salvo o codigo gerado.</param>
        public void Generate(TableMap map, string baseTypeName, Stream outStream)
        {
            if (map == null)
            {
                throw new ArgumentNullException("map");
            }
            CodeCompileUnit codeCU = new CodeCompileUnit();

            codeCU.StartDirectives.Clear();
            CodeNamespace codeNsp = new CodeNamespace(_namespaceName);

            codeNsp.Imports.Add(new CodeNamespaceImport("System"));
            codeNsp.Imports.Add(new CodeNamespaceImport("GDA"));
            if (UsingWCFPattern)
            {
                codeNsp.Imports.Add(new CodeNamespaceImport("System.Runtime.Serialization"));
            }
            foreach (CodeNamespaceImport cni in _imports)
            {
                codeNsp.Imports.Add(cni);
            }
            codeCU.Namespaces.Add(codeNsp);
            CodeTypeDeclaration codeType = new CodeTypeDeclaration(StandartName(map.TableName, true));

            codeType.Comments.Add(new CodeCommentStatement("<summary>", true));
            codeType.Comments.Add(new CodeCommentStatement(string.Format("This class represent the {0} {1}.", (map.IsView ? "view" : "table"), map.TableName), true));
            if (!string.IsNullOrEmpty(map.Comment))
            {
                codeType.Comments.Add(new CodeCommentStatement(map.Comment, true));
            }
            codeType.Comments.Add(new CodeCommentStatement("</summary>", true));
            if (!string.IsNullOrEmpty(baseTypeName))
            {
                codeType.BaseTypes.Add(new CodeTypeReference(baseTypeName));
            }
            codeType.CustomAttributes.Add(new CodeAttributeDeclaration("PersistenceClass", new CodeAttributeArgument(new CodeTypeReferenceExpression("\"" + StandartName(map.TableName, false) + "\""))));
            if (UsingWCFPattern)
            {
                CodeAttributeDeclaration codeAD = new CodeAttributeDeclaration("DataContract");
                codeAD.Arguments.Add(new CodeAttributeArgument("Name", new CodeTypeReferenceExpression("\"" + StandartName(map.TableName, false) + "\"")));
                codeAD.Arguments.Add(new CodeAttributeArgument("Namespace", new CodeTypeReferenceExpression("\"\"")));
                codeType.CustomAttributes.Add(codeAD);
            }
            foreach (CodeAttributeDeclaration attr in _classCustomAttributes)
            {
                codeType.CustomAttributes.Add(attr);
            }
            for (int i = 0; i < map.Fields.Count; i++)
            {
                FieldMap fm = map.Fields[i];
                if (string.IsNullOrEmpty(fm.ColumnName))
                {
                    continue;
                }
                string fieldName = StandartName(fm.ColumnName, true);
                if (fieldName.Length > 1)
                {
                    fieldName = "_" + char.ToLower(fieldName[0]) + fieldName.Substring(1);
                }
                else
                {
                    fieldName = "_" + fieldName.ToUpper();
                }
                CodeMemberField field = new CodeMemberField(fm.MemberType, fieldName);
                codeType.Members.Add(field);
                if (i == 0)
                {
                    CodeRegionDirective startlocalVariablesRegion = new CodeRegionDirective(CodeRegionMode.Start, "Local Variables\r\n");
                    field.StartDirectives.Add(startlocalVariablesRegion);
                }
                if (i + 1 == map.Fields.Count || map.Fields.Count == 1)
                {
                    CodeRegionDirective endlocalVariablesRegion = new CodeRegionDirective(CodeRegionMode.End, "Local Variables");
                    field.EndDirectives.Add(endlocalVariablesRegion);
                }
            }
            for (int i = 0; i < map.Fields.Count; i++)
            {
                FieldMap fm = map.Fields[i];
                if (string.IsNullOrEmpty(fm.ColumnName))
                {
                    continue;
                }
                string fieldName = StandartName(fm.ColumnName, true);
                if (fieldName.Length > 1)
                {
                    fieldName = "_" + char.ToLower(fieldName[0]) + fieldName.Substring(1);
                }
                else
                {
                    fieldName = "_" + fieldName.ToUpper();
                }
                string             propertyName = StandartName(fm.ColumnName, true);
                Type               pType        = fm.MemberType;
                CodeMemberProperty property     = new CodeMemberProperty();
                property.Name       = propertyName;
                property.Type       = new CodeTypeReference(pType);
                property.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                if (!string.IsNullOrEmpty(fm.Comment))
                {
                    property.Comments.Add(new CodeCommentStatement("<summary>", true));
                    property.Comments.Add(new CodeCommentStatement(fm.Comment, true));
                    property.Comments.Add(new CodeCommentStatement("</summary>", true));
                }
                CodeAttributeDeclaration cadPP = new CodeAttributeDeclaration("PersistenceProperty");
                cadPP.Arguments.Add(new CodeAttributeArgument(new CodeTypeReferenceExpression("\"" + fm.ColumnName + "\"")));
                if (fm.IsAutoGenerated)
                {
                    cadPP.Arguments.Add(new CodeAttributeArgument(new CodeTypeReferenceExpression("PersistenceParameterType.IdentityKey")));
                }
                else if (fm.IsPrimaryKey)
                {
                    cadPP.Arguments.Add(new CodeAttributeArgument(new CodeTypeReferenceExpression("PersistenceParameterType.Key")));
                }
                if (!pType.IsValueType && fm.Size > 0)
                {
                    cadPP.Arguments.Add(new CodeAttributeArgument(new CodeTypeReferenceExpression(fm.Size.ToString())));
                }
                property.CustomAttributes.Add(cadPP);
                if (!pType.IsValueType && !fm.IsNullable)
                {
                    CodeAttributeDeclaration cadReq = new CodeAttributeDeclaration("RequiredValidator");
                    property.CustomAttributes.Add(cadReq);
                }
                if (!string.IsNullOrEmpty(fm.ForeignKeyTableName))
                {
                    property.CustomAttributes.Add(new CodeAttributeDeclaration("PersistenceForeignKey", new CodeAttributeArgument(new CodeTypeReferenceExpression("typeof(" + StandartName(fm.ForeignKeyTableName, true) + ")")), new CodeAttributeArgument(new CodeTypeReferenceExpression("\"" + StandartName(fm.ForeignKeyColumnName, true) + "\""))));
                }
                if (UsingWCFPattern)
                {
                    CodeAttributeDeclaration codeAD = new CodeAttributeDeclaration("DataMember");
                    codeAD.Arguments.Add(new CodeAttributeArgument("Name", new CodeTypeReferenceExpression("\"" + property.Name + "\"")));
                    if (!fm.IsNullable)
                    {
                        codeAD.Arguments.Add(new CodeAttributeArgument("IsRequired", new CodePrimitiveExpression(true)));
                    }
                    property.CustomAttributes.Add(codeAD);
                }
                foreach (CodeAttributeDeclaration attr in _propertyCustomAttributes)
                {
                    property.CustomAttributes.Add(attr);
                }
                property.GetStatements.Add(new CodeMethodReturnStatement(new CodePropertyReferenceExpression(null, fieldName)));
                property.SetStatements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(null, fieldName), new CodePropertySetValueReferenceExpression()));
                codeType.Members.Add(property);
                if (i == 0)
                {
                    CodeRegionDirective startlocalVariablesRegion = new CodeRegionDirective(CodeRegionMode.Start, "Properties\r\n");
                    property.StartDirectives.Add(startlocalVariablesRegion);
                }
                if (i + 1 == map.Fields.Count || map.Fields.Count == 1)
                {
                    CodeRegionDirective endlocalVariablesRegion = new CodeRegionDirective(CodeRegionMode.End, "Properties");
                    property.EndDirectives.Add(endlocalVariablesRegion);
                }
            }
            codeNsp.Types.Add(codeType);
            StringBuilder        sb      = new StringBuilder();
            StringWriter         sw      = new StringWriter(sb);
            CodeGeneratorOptions options = new CodeGeneratorOptions();

            options.BracingStyle  = "C";
            options.ElseOnClosing = true;
            CodeDomProvider provider = CodeDomProvider.CreateProvider(_codeLanguage);

            provider.GenerateCodeFromNamespace(codeNsp, sw, options);
            string code = sb.ToString();

            code = code.Replace("System.DateTime", "DateTime");
            int pos1 = 0, pos2 = 0, pos3 = 0;

            do
            {
                pos1 = code.IndexOf("System.Nullable<", pos1);
                if (pos1 >= 0)
                {
                    pos2 = code.IndexOf('>', pos1);
                    pos3 = pos1 + "System.Nullable<".Length;
                    code = code.Substring(0, pos1) + code.Substring(pos3, pos2 - pos3) + "?" + code.Substring(pos2 + 1);
                }
            }while (pos1 >= 0);
            outStream.Write(System.Text.Encoding.Default.GetBytes(code), 0, code.Length);
        }