예제 #1
0
        private static CodeTypeDeclaration CreateDbContextCode(IInstanceInfo instanceInfo)
        {
            var codeDbContext = new CodeTypeDeclaration(instanceInfo.GetDbContextName())
            {
                IsPartial = true
            };

            codeDbContext.BaseTypes.Add(new CodeTypeReference(typeof(DbContext)));
            var constructor = new CodeConstructor
            {
                Attributes = MemberAttributes.Public
            };
            var optionsParameter = new CodeParameterDeclarationExpression($"DbContextOptions<{instanceInfo.GetDbContextName()}>", "options");

            constructor.Parameters.Add(optionsParameter);
            constructor.BaseConstructorArgs.Add(new CodeVariableReferenceExpression("options"));
            codeDbContext.Members.Add(constructor);
            return(codeDbContext);
        }
예제 #2
0
        public CodeDomBusinessCode CreateCode(IMetadataCache cache, IInstanceInfo instanceInfo)
        {
            var compileUnit   = new CodeCompileUnit();
            var codeNamespace = new CodeNamespace(instanceInfo.GetNamespace());

            codeNamespace.Imports.Add(new CodeNamespaceImport(typeof(IDisposable).Namespace));
            codeNamespace.Imports.Add(new CodeNamespaceImport(typeof(DbContext).Namespace));
            codeNamespace.Imports.Add(new CodeNamespaceImport(typeof(IBusinessRepositoryFactory).Namespace));
            codeNamespace.Imports.Add(new CodeNamespaceImport(typeof(KeyAttribute).Namespace));
            codeNamespace.Imports.Add(new CodeNamespaceImport(typeof(NotMappedAttribute).Namespace));
            codeNamespace.Imports.Add(new CodeNamespaceImport(typeof(TableAttribute).Namespace));
            codeNamespace.Imports.Add(new CodeNamespaceImport(typeof(ForeignKeyAttribute).Namespace));
            codeNamespace.Imports.Add(new CodeNamespaceImport(typeof(JsonIgnoreAttribute).Namespace));

            var codeDbContext = CreateDbContextCode(instanceInfo);

            codeNamespace.Types.Add(codeDbContext);
            foreach (var type in cache)
            {
                var primaryKey = type.GetPrimaryKey();
                var codeType   = new CodeTypeDeclaration(type.Name)
                {
                    IsPartial = true
                };
                if (primaryKey == null)
                {
                    codeType.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(NotMappedAttribute))));
                }
                else
                {
                    AddTypeToDbContext(type, codeDbContext);
                }
                if (!string.IsNullOrWhiteSpace(type.SchemaName) || !string.IsNullOrWhiteSpace(type.TableName))
                {
                    if (string.IsNullOrWhiteSpace(type.SchemaName))
                    {
                        codeType.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(TableAttribute)),
                                                                                   new CodeAttributeArgument(new CodePrimitiveExpression(type.TableName ?? type.Name.Pluralize()))));
                    }
                    else
                    {
                        codeType.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(TableAttribute)),
                                                                                   new CodeAttributeArgument(new CodePrimitiveExpression(type.TableName ?? type.Name.Pluralize())),
                                                                                   new CodeAttributeArgument("Schema", new CodePrimitiveExpression(type.SchemaName ?? "dbo"))
                                                                                   ));
                    }
                }
                foreach (var property in type.GetDirectProperties().OrderBy(x => x.Name))
                {
                    if (property.IsExpression)
                    {
                        continue;
                    }
                    var snippet = new CodeSnippetTypeMember();

                    string dataType;
                    if (property.DataType == DataTypes.NavigationEntity || property.DataType == DataTypes.NavigationList)
                    {
                        snippet.Text += "		[JsonIgnore]"+ Environment.NewLine;
                    }
                    if (property.DataType == DataTypes.Date)
                    {
                        snippet.Text += "		[Column(TypeName=\"date\")]"+ Environment.NewLine;
                    }
                    if (property.DataType == DataTypes.NavigationList)
                    {
                        dataType = $"System.Collections.Generic.ICollection<{property.EntityTypeName}>";
                    }
                    else if (property.DataType == DataTypes.ForeignKey)
                    {
                        var propertyType = cache[property.EntityTypeName];
                        dataType = propertyType.GetPrimaryKey().GetDataType().ClrType;
                    }
                    else
                    {
                        dataType = property.EntityTypeName ?? property.GetDataType().ClrType;
                    }
                    if (property.IsNullable && property.GetDataType().IsValueType)
                    {
                        dataType += "?";
                    }
                    if (property.InverseProperty != null)
                    {
                        snippet.Text += $"		[InverseProperty(\"{property.InverseProperty.Name}\")]\n";
                    }
                    if (property.ForeignKey != null)
                    {
                        snippet.Text += $"		[ForeignKey(\"{property.ForeignKey.Name}\")]\n";
                    }
                    if (property == primaryKey)
                    {
                        snippet.Text += "		[Key]\n";
                    }
                    snippet.Text += $"		public virtual {dataType} {property.Name} {{ get; set; }}";
                    codeType.Members.Add(snippet);
                }
                codeNamespace.Types.Add(codeType);
            }
            var factoryCode = new CodeTypeDeclaration("DbContextFactory")
            {
                IsPartial = true
            };

            factoryCode.BaseTypes.Add($"IBusinessRepositoryFactory");
            factoryCode.Members.Add(new CodeSnippetTypeMember($"		public virtual IDisposable GetDbContext(DbContextOptions options){{ return new {instanceInfo.GetDbContextName()}(options as DbContextOptions<{instanceInfo.GetDbContextName()}>); }}"));
            factoryCode.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(ExportAttribute)),
                                                                          new CodeAttributeArgument(new CodeSnippetExpression("typeof(IBusinessRepositoryFactory)"))));
            codeNamespace.Types.Add(factoryCode);
            compileUnit.Namespaces.Add(codeNamespace);
            return(new CodeDomBusinessCode {
                Code = compileUnit
            });
        }