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); }
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 }); }