public static CSharpClassDefinition GetEntityClassDefinition(this EntityFrameworkCoreProject project, IView view) { var classDefinition = new CSharpClassDefinition(); classDefinition.Namespaces.Add("System"); if (project.Settings.UseDataAnnotations) { classDefinition.Namespaces.Add("System.ComponentModel.DataAnnotations"); classDefinition.Namespaces.Add("System.ComponentModel.DataAnnotations.Schema"); } classDefinition.Namespace = view.HasDefaultSchema() ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(view.Schema); classDefinition.Name = view.GetSingularName(); classDefinition.IsPartial = true; classDefinition.Constructors.Add(new ClassConstructorDefinition()); if (!string.IsNullOrEmpty(view.Description)) { classDefinition.Documentation.Summary = view.Description; } foreach (var column in view.Columns) { classDefinition.Properties.Add(new PropertyDefinition(column.GetClrType(), column.HasSameNameEnclosingType(view) ? column.GetNameForEnclosing() : column.GetPropertyName())); } if (project.Settings.SimplifyDataTypes) { classDefinition.SimplifyDataTypes(); } return(classDefinition); }
public static RepositoryExtensionsClassDefinition GetRepositoryExtensionsClassDefinition(this EntityFrameworkCoreProject project) { var definition = new RepositoryExtensionsClassDefinition { Namespaces = { "System", "System.Linq", project.GetDataLayerNamespace(), project.GetEntityLayerNamespace() }, Namespace = project.GetDataLayerRepositoriesNamespace(), AccessModifier = AccessModifier.Public, IsStatic = true, Name = "RepositoryExtensions" }; definition.Methods.Add(new MethodDefinition("IQueryable<TEntity>", "Paging", new ParameterDefinition(project.GetDbContextName(project.Database), "dbContext"), new ParameterDefinition("int", "pageSize", "0"), new ParameterDefinition("int", "pageNumber", "0")) { AccessModifier = AccessModifier.Public, IsExtension = true, IsStatic = true, GenericTypes = { new GenericTypeDefinition { Name = "TEntity", Constraint = "TEntity : class" } }, Lines = { new CodeLine("var query = dbContext.Set<TEntity>().AsQueryable();"), new CodeLine(), new CodeLine("return pageSize > 0 && pageNumber > 0 ? query.Skip((pageNumber - 1) * pageSize).Take(pageSize) : query;") } }); definition.Methods.Add(new MethodDefinition("IQueryable<TModel>", "Paging", new ParameterDefinition("IQueryable<TModel>", "query"), new ParameterDefinition("int", "pageSize", "0"), new ParameterDefinition("int", "pageNumber", "0")) { AccessModifier = AccessModifier.Public, IsExtension = true, IsStatic = true, GenericTypes = { new GenericTypeDefinition { Name = "TModel", Constraint = "TModel : class" } }, Lines = { new CodeLine("return pageSize > 0 && pageNumber > 0 ? query.Skip((pageNumber - 1) * pageSize).Take(pageSize) : query;") } }); return(definition); }
public static EntityInterfaceDefinition GetEntityInterfaceDefinition(this EntityFrameworkCoreProject project) => new EntityInterfaceDefinition { Namespace = project.GetEntityLayerNamespace(), Namespaces = { "System" }, Name = "IEntity" };
public static CSharpClassDefinition GetEntityClassDefinition(this EntityFrameworkCoreProject project, IView view) { var definition = new CSharpClassDefinition { Namespaces = { "System" }, Namespace = project.Database.HasDefaultSchema(view) ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(view.Schema), Name = project.GetEntityName(view), IsPartial = true, Constructors = { new ClassConstructorDefinition() } }; if (!string.IsNullOrEmpty(view.Description)) { definition.Documentation.Summary = view.Description; } var projectSelection = project.GetSelection(view); if (projectSelection.Settings.UseDataAnnotations) { definition.Namespaces.Add("System.ComponentModel.DataAnnotations"); definition.Namespaces.Add("System.ComponentModel.DataAnnotations.Schema"); } foreach (var column in view.Columns) { var propertyType = string.Empty; if (project.Database.HasTypeMappedToClr(column)) { var clrType = project.Database.GetClrMapForType(column); propertyType = clrType.AllowClrNullable ? string.Format("{0}?", clrType.GetClrType().Name) : clrType.GetClrType().Name; } else { propertyType = "object"; } definition.Properties.Add(new PropertyDefinition(propertyType, column.HasSameNameEnclosingType(view) ? column.GetNameForEnclosing() : view.GetPropertyNameHack(column))); } if (projectSelection.Settings.SimplifyDataTypes) { definition.SimplifyDataTypes(); } return(definition); }
public static EntityClassDefinition GetEntityClassDefinition(this EntityFrameworkCoreProject project, IView view) { var definition = new EntityClassDefinition { Namespaces = { "System" }, Namespace = project.Database.HasDefaultSchema(view) ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(view.Schema), AccessModifier = AccessModifier.Public, Name = project.GetEntityName(view), IsPartial = true, Constructors = { new ClassConstructorDefinition { AccessModifier = AccessModifier.Public } }, DbObject = view }; if (!string.IsNullOrEmpty(view.Description)) { definition.Documentation.Summary = view.Description; } var projectSelection = project.GetSelection(view); if (projectSelection.Settings.UseDataAnnotations) { definition.Namespaces.Add("System.ComponentModel.DataAnnotations"); definition.Namespaces.Add("System.ComponentModel.DataAnnotations.Schema"); } foreach (var column in view.Columns) { var propertyType = project.Database.ResolveDatabaseType(column); definition.Properties.Add(new PropertyDefinition { AccessModifier = AccessModifier.Public, Type = propertyType, Name = project.GetPropertyName(view, column), IsAutomatic = true }); } if (projectSelection.Settings.SimplifyDataTypes) { definition.SimplifyDataTypes(); } return(definition); }
public static EntityInterfaceDefinition GetEntityInterfaceDefinition(this EntityFrameworkCoreProject project, bool isDomainDrivenDesign) => new EntityInterfaceDefinition { Namespace = isDomainDrivenDesign ? project.GetDomainModelsNamespace() : project.GetEntityLayerNamespace(), Namespaces = { "System" }, AccessModifier = AccessModifier.Public, Name = "IEntity" };
public static CSharpClassDefinition GetRepositoryExtensionsClassDefinition(this EntityFrameworkCoreProject project) { var classDefinition = new CSharpClassDefinition(); classDefinition.Namespaces.Add("System"); classDefinition.Namespaces.Add("System.Linq"); classDefinition.Namespaces.Add(project.GetDataLayerNamespace()); classDefinition.Namespaces.Add(project.GetEntityLayerNamespace()); classDefinition.Namespace = project.GetDataLayerRepositoriesNamespace(); classDefinition.IsStatic = true; classDefinition.Name = "RepositoryExtensions"; classDefinition.Methods.Add(new MethodDefinition("IQueryable<TEntity>", "Paging", new ParameterDefinition(project.Database.GetDbContextName(), "dbContext"), new ParameterDefinition("Int32", "pageSize", "0"), new ParameterDefinition("Int32", "pageNumber", "0")) { IsExtension = true, IsStatic = true, GenericTypes = new List <GenericTypeDefinition> { new GenericTypeDefinition { Name = "TEntity", Constraint = "TEntity : class" } }, Lines = new List <ILine>() { new CodeLine("var query = dbContext.Set<TEntity>().AsQueryable();"), new CodeLine(), new CodeLine("return pageSize > 0 && pageNumber > 0 ? query.Skip((pageNumber - 1) * pageSize).Take(pageSize) : query;") } }); classDefinition.Methods.Add(new MethodDefinition("IQueryable<TModel>", "Paging", new ParameterDefinition("IQueryable<TModel>", "query"), new ParameterDefinition("Int32", "pageSize", "0"), new ParameterDefinition("Int32", "pageNumber", "0")) { IsExtension = true, IsStatic = true, GenericTypes = new List <GenericTypeDefinition> { new GenericTypeDefinition { Name = "TModel", Constraint = "TModel : class" } }, Lines = new List <ILine>() { new CodeLine("return pageSize > 0 && pageNumber > 0 ? query.Skip((pageNumber - 1) * pageSize).Take(pageSize) : query;") } }); return(classDefinition); }
public static EntityClassDefinition GetEntityClassDefinition(this EntityFrameworkCoreProject project, StoredProcedure storedProcedure) { var definition = new EntityClassDefinition { Namespaces = { "System" }, Namespace = project.Database.HasDefaultSchema(storedProcedure) ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(storedProcedure.Schema), AccessModifier = AccessModifier.Public, Name = project.GetEntityResultName(storedProcedure), IsPartial = true, Constructors = { new ClassConstructorDefinition { AccessModifier = AccessModifier.Public } }, DbObject = storedProcedure }; if (!string.IsNullOrEmpty(storedProcedure.Description)) definition.Documentation.Summary = storedProcedure.Description; var projectSelection = project.GetSelection(storedProcedure); if (storedProcedure.FirstResultSetsForObject.Count == 0) { // todo: Add logic to stored procedures with no result set } else { foreach (var property in storedProcedure.FirstResultSetsForObject) { var propertyType = project.Database.ResolveDatabaseType(property.SystemTypeName); definition.Properties.Add(new PropertyDefinition(AccessModifier.Public, propertyType, project.GetPropertyName(property.Name)) { IsAutomatic = true }); } } if (projectSelection.Settings.SimplifyDataTypes) definition.SimplifyDataTypes(); return definition; }
public static EntityClassDefinition GetEntityClassDefinition(this EntityFrameworkCoreProject project, TableFunction tableFunction) { var definition = new EntityClassDefinition { Namespaces = { "System" }, Namespace = project.Database.HasDefaultSchema(tableFunction) ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(tableFunction.Schema), AccessModifier = AccessModifier.Public, Name = project.GetEntityResultName(tableFunction), IsPartial = true, Constructors = { new ClassConstructorDefinition { AccessModifier = AccessModifier.Public } }, DbObject = tableFunction }; if (!string.IsNullOrEmpty(tableFunction.Description)) { definition.Documentation.Summary = tableFunction.Description; } var projectSelection = project.GetSelection(tableFunction); foreach (var column in tableFunction.Columns) { var type = project.Database.ResolveDatabaseType(column); definition.Properties.Add(new PropertyDefinition { AccessModifier = AccessModifier.Public, Type = type, Name = project.GetPropertyName(column.Name), IsAutomatic = true }); } if (projectSelection.Settings.SimplifyDataTypes) { definition.SimplifyDataTypes(); } return(definition); }
public static CSharpInterfaceDefinition GetAuditEntityInterfaceDefinition(this EntityFrameworkCoreProject project) { var interfaceDefinition = new CSharpInterfaceDefinition(); interfaceDefinition.Namespaces.Add("System"); interfaceDefinition.Namespace = project.GetEntityLayerNamespace(); interfaceDefinition.Name = "IAuditEntity"; interfaceDefinition.Implements.Add("IEntity"); interfaceDefinition.Properties.Add(new PropertyDefinition("String", "CreationUser")); interfaceDefinition.Properties.Add(new PropertyDefinition("DateTime?", "CreationDateTime")); interfaceDefinition.Properties.Add(new PropertyDefinition("String", "LastUpdateUser")); interfaceDefinition.Properties.Add(new PropertyDefinition("DateTime?", "LastUpdateDateTime")); return(interfaceDefinition); }
public static AuditEntityInterfaceDefinition GetAuditEntityInterfaceDefinition(this EntityFrameworkCoreProject project) => new AuditEntityInterfaceDefinition { Namespaces = { "System" }, Namespace = project.GetEntityLayerNamespace(), Name = "IAuditEntity", Implements = { "IEntity" }, Properties = { new PropertyDefinition("string", "CreationUser"), new PropertyDefinition("DateTime?", "CreationDateTime"), new PropertyDefinition("string", "LastUpdateUser"), new PropertyDefinition("DateTime?", "LastUpdateDateTime") } };
public static AuditEntityInterfaceDefinition GetAuditEntityInterfaceDefinition(this EntityFrameworkCoreProject project, bool isDomainDrivenDesign) => new AuditEntityInterfaceDefinition { Namespaces = { "System" }, Namespace = isDomainDrivenDesign ? project.GetDomainModelsNamespace() : project.GetEntityLayerNamespace(), AccessModifier = AccessModifier.Public, Name = "IAuditEntity", Implements = { "IEntity" }, Properties = { new PropertyDefinition("string", "CreationUser"), new PropertyDefinition("DateTime?", "CreationDateTime"), new PropertyDefinition("string", "LastUpdateUser"), new PropertyDefinition("DateTime?", "LastUpdateDateTime") } };
public static CSharpClassDefinition GetRepositoryBaseClassDefinition(this EntityFrameworkCoreProject project) { var classDefinition = new CSharpClassDefinition(); classDefinition.Namespaces.Add("System"); classDefinition.Namespaces.Add("System.Linq"); classDefinition.Namespaces.Add("System.Threading.Tasks"); classDefinition.Namespaces.Add("Microsoft.EntityFrameworkCore"); if (project.Settings.AuditEntity != null) { classDefinition.Namespaces.Add(project.GetEntityLayerNamespace()); } classDefinition.Namespace = project.GetDataLayerContractsNamespace(); classDefinition.Name = "Repository"; classDefinition.Fields.Add(new FieldDefinition(AccessModifier.Protected, "Boolean", "Disposed")); classDefinition.Fields.Add(new FieldDefinition(AccessModifier.Protected, project.Database.GetDbContextName(), "DbContext")); classDefinition.Constructors.Add(new ClassConstructorDefinition(new ParameterDefinition(project.Database.GetDbContextName(), "dbContext")) { Lines = new List <ILine>() { new CodeLine("DbContext = dbContext;") } }); classDefinition.Methods.Add(new MethodDefinition("void", "Dispose") { Lines = new List <ILine> { new CodeLine("if (!Disposed)"), new CodeLine("{"), new CodeLine(1, "DbContext?.Dispose();"), new CodeLine(), new CodeLine(1, "Disposed = true;"), new CodeLine("}") } }); classDefinition.Methods.Add(GetAddMethod(project)); classDefinition.Methods.Add(GetUpdateMethod(project)); classDefinition.Methods.Add(GetRemoveMethod(project)); classDefinition.Methods.Add(new MethodDefinition("Int32", "CommitChanges") { Lines = new List <ILine> { new CodeLine("return DbContext.SaveChanges();") } }); classDefinition.Methods.Add(new MethodDefinition("Task<Int32>", "CommitChangesAsync") { Lines = new List <ILine> { new CodeLine("return DbContext.SaveChangesAsync();") } }); return(classDefinition); }
public static EntityConfigurationClassDefinition GetEntityConfigurationClassDefinition(this EntityFrameworkCoreProject project, IView view) { var definition = new EntityConfigurationClassDefinition { Namespaces = { "Microsoft.EntityFrameworkCore", "Microsoft.EntityFrameworkCore.Metadata.Builders" }, Namespace = project.Database.HasDefaultSchema(view) ? project.GetDataLayerConfigurationsNamespace() : project.GetDataLayerConfigurationsNamespace(view.Schema), AccessModifier = AccessModifier.Public, Name = project.GetEntityConfigurationName(view), Implements = { string.Format("IEntityTypeConfiguration<{0}>", project.GetEntityName(view)) }, DbObject = view }; definition.Namespaces.AddUnique(project.GetEntityLayerNamespace(project.Database.HasDefaultSchema(view) ? string.Empty : view.Schema)); var configLines = new List <ILine> { new CommentLine(" Set configuration for entity") }; if (string.IsNullOrEmpty(view.Schema)) { configLines.Add(new CodeLine("builder.ToTable(\"{0}\");", view.Name)); } else { configLines.Add(new CodeLine("builder.ToTable(\"{0}\", \"{1}\");", view.Name, view.Schema)); } configLines.Add(new EmptyLine()); var primaryKeys = project .Database .Tables .Where(item => item.PrimaryKey != null) .Select(item => item.GetColumnsFromConstraint(item.PrimaryKey).Select(c => c.Name).First()) .ToList(); var result = view.Columns.Where(item => primaryKeys.Contains(item.Name)).ToList(); if (result.Count == 0) { result = view.Columns.Where(item => !item.Nullable).ToList(); } configLines.Add(new CommentLine(" Add configuration for entity's key")); if (result.Count == 1) { configLines.Add(new CodeLine("builder.HasKey(p => {0});", string.Format("p.{0}", project.CodeNamingConvention.GetPropertyName(result.First().Name)))); } else { configLines.Add(new CodeLine("builder.HasKey(p => new {{ {0} }});", string.Join(", ", result.Select(item => string.Format("p.{0}", project.CodeNamingConvention.GetPropertyName(item.Name)))))); } configLines.Add(new EmptyLine()); configLines.Add(new CommentLine(" Set configuration for columns")); for (var i = 0; i < view.Columns.Count; i++) { var column = view.Columns[i]; var valueConversion = default(Type); if (project.Database.HasTypeMappedToClr(column)) { var lines = new List <string> { string.Format("Property(p => p.{0})", project.GetPropertyName(view, column)) }; if (string.Compare(column.Name, project.GetPropertyName(view, column)) != 0) { lines.Add(string.Format("HasColumnName(\"{0}\")", column.Name)); } else if (project.Database.ColumnIsDecimal(column)) { lines.Add(string.Format("HasColumnType(\"{0}({1}, {2})\")", column.Type, column.Prec, column.Scale)); } else if (project.Database.ColumnIsDouble(column) || project.Database.ColumnIsSingle(column)) { lines.Add(string.Format("HasColumnType(\"{0}({1})\")", column.Type, column.Prec)); } if (project.Database.ColumnIsString(column)) { lines.Add(column.Length <= 0 ? string.Format("HasColumnType(\"{0}(max)\")", column.Type) : string.Format("HasColumnType(\"{0}({1})\")", column.Type, column.Length)); } else { lines.Add(string.Format("HasColumnType(\"{0}\")", column.Type)); } // Use ValueConversionMaps to detect and apply ValueConversion Type based on Type if (project.ValueConversionMaps?.TryGetValue(column.Type, out valueConversion) == true) { lines.Add($"HasConversion(typeof({valueConversion?.FullName}))"); } configLines.Add(new CodeLine("builder")); foreach (var line in lines) { configLines.Add(new CodeLine(1, ".{0}", line)); } configLines.Add(new CodeLine(1, ";")); configLines.Add(new EmptyLine()); } else { var lines = new List <string> { string.Format("builder.Ignore(p => p.{0})", project.GetPropertyName(view, column)) }; configLines.Add(new CodeLine("{0};", string.Join(".", lines))); } } definition.Methods.Add(new MethodDefinition { AccessModifier = AccessModifier.Public, Type = "void", Name = "Configure", Parameters = { new ParameterDefinition(string.Format("EntityTypeBuilder<{0}>", project.GetEntityName(view)), "builder") }, Lines = configLines }); return(definition); }
public static EntityConfigurationClassDefinition GetEntityConfigurationClassDefinition(this EntityFrameworkCoreProject project, ITable table) { var definition = new EntityConfigurationClassDefinition { Namespaces = { "Microsoft.EntityFrameworkCore", "Microsoft.EntityFrameworkCore.Metadata.Builders" }, Namespace = project.Database.HasDefaultSchema(table) ? project.GetDataLayerConfigurationsNamespace() : project.GetDataLayerConfigurationsNamespace(table.Schema), AccessModifier = AccessModifier.Public, Name = project.GetEntityConfigurationName(table), DbObject = table }; definition.Namespaces.AddUnique(project.GetEntityLayerNamespace(project.Database.HasDefaultSchema(table) ? string.Empty : table.Schema)); // todo: Check logic to build property's name var propertyType = ""; if (table.HasSameEnclosingName()) { propertyType = string.Join(".", (new string[] { project.ProjectNamespaces.EntityLayer, project.Database.HasDefaultSchema(table) ? string.Empty : table.Schema, project.GetEntityName(table) }).Where(item => !string.IsNullOrEmpty(item))); } else { propertyType = project.GetEntityName(table); } definition.Implements.Add(string.Format("IEntityTypeConfiguration<{0}>", propertyType)); var configLines = new List <ILine> { new CommentLine(" Set configuration for entity") }; if (string.IsNullOrEmpty(table.Schema)) { configLines.Add(new CodeLine("builder.ToTable(\"{0}\");", table.Name)); } else { configLines.Add(new CodeLine("builder.ToTable(\"{0}\", \"{1}\");", table.Name, table.Schema)); } configLines.Add(new EmptyLine()); var columns = default(List <Column>); if (table.PrimaryKey == null || table.PrimaryKey.Key.Count == 0) { configLines.Add(LineHelper.Warning("Add configuration for entity's key")); configLines.Add(new EmptyLine()); } else { configLines.Add(new CommentLine(" Set key for entity")); if (table.PrimaryKey.Key.Count == 1) { configLines.Add(new CodeLine("builder.HasKey(p => p.{0});", project.CodeNamingConvention.GetPropertyName(table.PrimaryKey.Key[0]))); configLines.Add(new EmptyLine()); } else if (table.PrimaryKey.Key.Count > 1) { configLines.Add(new CodeLine("builder.HasKey(p => new {{ {0} }});", string.Join(", ", table.PrimaryKey.Key.Select(item => string.Format("p.{0}", project.CodeNamingConvention.GetPropertyName(item)))))); configLines.Add(new EmptyLine()); } } if (table.Identity != null) { configLines.Add(new CommentLine(" Set identity for entity (auto increment)")); configLines.Add(new CodeLine("builder.Property(p => p.{0}).UseSqlServerIdentityColumn();", project.CodeNamingConvention.GetPropertyName(table.Identity.Name))); configLines.Add(new EmptyLine()); } columns = table.Columns; configLines.Add(new CommentLine(" Set configuration for columns")); for (var i = 0; i < columns.Count; i++) { var column = columns[i]; var valueConversion = default(Type); if (project.Database.HasTypeMappedToClr(column)) { var lines = new List <string> { string.Format("Property(p => p.{0})", project.GetPropertyName(table, column)) }; if (string.Compare(column.Name, project.GetPropertyName(table, column)) != 0) { lines.Add(string.Format("HasColumnName(\"{0}\")", column.Name)); } if (project.Database.ColumnIsByteArray(column)) { lines.Add(string.Format("HasColumnType(\"{0}({1})\")", column.Type, column.Length)); } else if (project.Database.ColumnIsDecimal(column)) { lines.Add(string.Format("HasColumnType(\"{0}({1}, {2})\")", column.Type, column.Prec, column.Scale)); } else if (project.Database.ColumnIsDouble(column) || project.Database.ColumnIsSingle(column)) { lines.Add(string.Format("HasColumnType(\"{0}({1})\")", column.Type, column.Prec)); } else if (project.Database.ColumnIsString(column)) { if (column.Length <= 0) { lines.Add(string.Format("HasColumnType(\"{0}(max)\")", column.Type)); } else { lines.Add(string.Format("HasColumnType(\"{0}\")", column.Type)); lines.Add(string.Format("HasMaxLength({0})", column.Length)); } } else { lines.Add(string.Format("HasColumnType(\"{0}\")", column.Type)); } // Use ValueConversionMaps to detect and apply ValueConversion Type based on Type if (project.ValueConversionMaps.TryGetValue(column.Type, out valueConversion) == true) { lines.Add($".HasConversion(typeof({valueConversion?.FullName}))"); } if (!column.Nullable) { lines.Add("IsRequired()"); } configLines.Add(new CodeLine("builder")); foreach (var line in lines) { configLines.Add(new CodeLine(1, ".{0}", line)); } configLines.Add(new CodeLine(1, ";")); configLines.Add(new EmptyLine()); } else { configLines.Add(new CodeLine("builder.Ignore(p => p.{0});", project.GetPropertyName(table, column))); configLines.Add(new EmptyLine()); } } var projectSelection = project.GetSelection(table); for (var i = 0; i < columns.Count; i++) { var column = columns[i]; if (!string.IsNullOrEmpty(projectSelection.Settings.ConcurrencyToken) && string.Compare(column.Name, projectSelection.Settings.ConcurrencyToken) == 0) { configLines.Add(new CommentLine(" Set concurrency token for entity")); configLines.Add(new CodeLine("builder")); configLines.Add(new CodeLine(1, ".Property(p => p.{0})", project.GetPropertyName(table, column))); configLines.Add(new CodeLine(1, ".ValueGeneratedOnAddOrUpdate()")); configLines.Add(new CodeLine(1, ".IsConcurrencyToken();")); configLines.Add(new EmptyLine()); } } if (projectSelection.Settings.AddConfigurationForUniquesInFluentAPI && table.Uniques.Count > 0) { configLines.Add(new CommentLine(" Add configuration for uniques")); configLines.Add(new EmptyLine()); foreach (var unique in table.Uniques) { configLines.Add(new CodeLine("builder")); if (unique.Key.Count == 1) { configLines.Add(new CodeLine(1, ".HasIndex(p => p.{0})", project.CodeNamingConvention.GetPropertyName(unique.Key.First()))); configLines.Add(new CodeLine(1, ".IsUnique()")); } else { configLines.Add(new CodeLine(1, ".HasIndex(p => new {{ {0} }})", string.Join(", ", unique.Key.Select(item => string.Format("p.{0}", project.CodeNamingConvention.GetPropertyName(item)))))); configLines.Add(new CodeLine(1, ".IsUnique()")); } configLines.Add(new CodeLine(1, ".HasName(\"{0}\");", unique.ConstraintName)); configLines.Add(new EmptyLine()); } } if (projectSelection.Settings.AddConfigurationForForeignKeysInFluentAPI && projectSelection.Settings.DeclareNavigationProperties && table.ForeignKeys.Count > 0) { configLines.Add(new CommentLine(" Add configuration for foreign keys")); configLines.Add(new EmptyLine()); foreach (var foreignKey in table.ForeignKeys) { var foreignTable = project.Database.FindTable(foreignKey.References); if (foreignTable == null || foreignKey.Key.Count == 0) { continue; } if (foreignKey.Key.Count == 1) { var foreignProperty = foreignKey.GetParentNavigationProperty(foreignTable, project); configLines.Add(new CodeLine("builder")); configLines.Add(new CodeLine(1, ".HasOne(p => p.{0})", foreignProperty.Name)); configLines.Add(new CodeLine(1, ".WithMany(b => b.{0})", project.GetNavigationPropertyName(table))); configLines.Add(new CodeLine(1, ".HasForeignKey(p => {0})", string.Format("p.{0}", project.CodeNamingConvention.GetPropertyName(foreignKey.Key.First())))); configLines.Add(new CodeLine(1, ".HasConstraintName(\"{0}\");", foreignKey.ConstraintName)); configLines.Add(new EmptyLine()); } else { configLines.Add(LineHelper.Warning(" Add logic for foreign key with multiple key")); } } } if (projectSelection.Settings.AddConfigurationForDefaultsInFluentAPI && table.Defaults.Count > 0) { configLines.Add(new CommentLine(" Add configuration for defaults")); configLines.Add(new EmptyLine()); foreach (var def in table.Defaults) { var propertyName = def.Key.First(); configLines.Add(new CodeLine("builder")); configLines.Add(new CodeLine(1, ".Property(p => p.{0})", project.GetPropertyName(propertyName))); configLines.Add(new CodeLine(1, ".HasDefaultValueSql(\"{0}\");", def.Value)); configLines.Add(new EmptyLine()); } } definition.Methods.Add(new MethodDefinition { AccessModifier = AccessModifier.Public, Type = "void", Name = "Configure", Parameters = { new ParameterDefinition(string.Format("EntityTypeBuilder<{0}>", propertyType), "builder") }, Lines = configLines }); return(definition); }
public static RepositoryBaseClassDefinition GetRepositoryBaseClassDefinition(this EntityFrameworkCoreProject project) { var definition = new RepositoryBaseClassDefinition { Namespaces = { "System", "System.Threading.Tasks", }, Namespace = project.GetDataLayerContractsNamespace(), AccessModifier = AccessModifier.Public, Name = "Repository", Fields = { new FieldDefinition(AccessModifier.Protected, "bool", "Disposed"), new FieldDefinition(AccessModifier.Protected, project.GetDbContextName(project.Database), "DbContext") { IsReadOnly = true } }, Constructors = { new ClassConstructorDefinition(AccessModifier.Public, new ParameterDefinition(project.GetDbContextName(project.Database), "dbContext")) { Lines = { new CodeLine("DbContext = dbContext;") } } }, Methods = { new MethodDefinition(AccessModifier.Public, "void", "Dispose") { IsVirtual = true, Lines = { new CodeLine("if (Disposed)"), new CodeLine(1, "return;"), new EmptyLine(), new CodeLine("DbContext?.Dispose();"), new EmptyLine(), new CodeLine("Disposed = true;") } }, GetAddMethod(project), GetUpdateMethod(project), GetRemoveMethod(project), new MethodDefinition(AccessModifier.Public, "int", "CommitChanges") { Lines = { new CodeLine("return DbContext.SaveChanges();") } }, new MethodDefinition(AccessModifier.Public, "Task<int>", "CommitChangesAsync") { IsAsync = true, Lines = { new CodeLine("return await DbContext.SaveChangesAsync();") } } } }; var selection = project.GlobalSelection(); if (selection.Settings.AuditEntity != null) { definition.Namespaces.Add(project.GetEntityLayerNamespace()); } return(definition); }
public static CSharpInterfaceDefinition GetEntityInterfaceDefinition(this EntityFrameworkCoreProject project) => new CSharpInterfaceDefinition { Namespace = project.GetEntityLayerNamespace(), Name = "IEntity" };
public static CSharpClassDefinition GetEntityClassDefinition(this EntityFrameworkCoreProject project, ITable table) { var classDefinition = new CSharpClassDefinition(); classDefinition.Namespaces.Add("System"); if (project.Settings.UseDataAnnotations) { classDefinition.Namespaces.Add("System.ComponentModel.DataAnnotations"); classDefinition.Namespaces.Add("System.ComponentModel.DataAnnotations.Schema"); } if (project.Settings.EnableDataBindings) { classDefinition.Namespaces.Add("System.ComponentModel"); classDefinition.Implements.Add("INotifyPropertyChanged"); classDefinition.Events.Add(new EventDefinition("PropertyChangedEventHandler", "PropertyChanged")); } classDefinition.Namespace = table.HasDefaultSchema() ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(table.Schema); classDefinition.Name = table.GetSingularName(); classDefinition.IsPartial = true; classDefinition.Constructors.Add(new ClassConstructorDefinition()); var columns = table.Columns; if (table.PrimaryKey?.Key.Count == 1) { var column = table.PrimaryKey.GetColumns(table).First(); classDefinition.Constructors.Add(new ClassConstructorDefinition(new ParameterDefinition(column.GetClrType(), column.GetParameterName())) { Lines = new List <ILine> { new CodeLine("{0} = {1};", column.GetPropertyName(), column.GetParameterName()) } }); } if (!string.IsNullOrEmpty(table.Description)) { classDefinition.Documentation.Summary = table.Description; } foreach (var column in columns) { if (project.Settings.EnableDataBindings) { classDefinition.AddViewModelProperty(column.GetClrType(), column.HasSameNameEnclosingType(table) ? column.GetNameForEnclosing() : column.GetPropertyName()); } else { if (project.Settings.BackingFields.Contains(table.GetFullColumnName(column))) { classDefinition.AddPropertyWithField(column.GetClrType(), column.HasSameNameEnclosingType(table) ? column.GetNameForEnclosing() : column.GetPropertyName()); } else if (project.Settings.UseAutomaticPropertiesForEntities) { classDefinition.Properties.Add(new PropertyDefinition(column.GetClrType(), column.HasSameNameEnclosingType(table) ? column.GetNameForEnclosing() : column.GetPropertyName())); } else { classDefinition.AddPropertyWithField(column.GetClrType(), column.HasSameNameEnclosingType(table) ? column.GetNameForEnclosing() : column.GetPropertyName()); } } } if (project.Settings.AuditEntity == null) { classDefinition.Implements.Add("IEntity"); } else { var count = 0; foreach (var column in columns) { if (project.Settings.AuditEntity.Names.Contains(column.Name)) { count += 1; } } if (count == project.Settings.AuditEntity.Names.Length) { classDefinition.Implements.Add(project.Settings.EntityInterfaceName); } else { classDefinition.Implements.Add("IEntity"); } } foreach (var foreignKey in table.ForeignKeys) { var foreignTable = project.Database.FindTableByFullName(foreignKey.References); if (foreignTable == null) { continue; } classDefinition.Namespaces.AddUnique(foreignTable.HasDefaultSchema() ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(foreignTable.Schema)); classDefinition.Namespace = table.HasDefaultSchema() ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(table.Schema); classDefinition.Properties.Add(foreignKey.GetParentNavigationProperty(project, foreignTable)); } foreach (var child in project.Database.Tables) { if (table.FullName == child.FullName) { continue; } foreach (var foreignKey in child.ForeignKeys) { if (foreignKey.References.EndsWith(table.FullName)) { classDefinition.Namespaces.AddUnique(project.Settings.NavigationPropertyEnumerableNamespace); classDefinition.Namespaces.AddUnique(child.HasDefaultSchema() ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(child.Schema)); var navigationProperty = project.GetChildNavigationProperty(child, foreignKey); if (classDefinition.Properties.FirstOrDefault(item => item.Name == navigationProperty.Name) == null) { classDefinition.Properties.Add(navigationProperty); } } } } if (project.Settings.SimplifyDataTypes) { classDefinition.SimplifyDataTypes(); } return(classDefinition); }
public static EntityClassDefinition GetEntityClassDefinition(this EntityFrameworkCoreProject project, ITable table) { var definition = new EntityClassDefinition { Namespaces = { "System" }, Namespace = project.Database.HasDefaultSchema(table) ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(table.Schema), AccessModifier = AccessModifier.Public, Name = project.GetEntityName(table), IsPartial = true, Constructors = { new ClassConstructorDefinition(AccessModifier.Public) }, DbObject = table }; if (!string.IsNullOrEmpty(table.Description)) { definition.Documentation.Summary = table.Description; } var projectSelection = project.GetSelection(table); if (projectSelection.Settings.UseDataAnnotations) { definition.Namespaces.Add("System.ComponentModel.DataAnnotations"); definition.Namespaces.Add("System.ComponentModel.DataAnnotations.Schema"); } if (projectSelection.Settings.EnableDataBindings) { definition.Namespaces.Add("System.ComponentModel"); definition.Implements.Add("INotifyPropertyChanged"); definition.Events.Add(new EventDefinition("PropertyChangedEventHandler", "PropertyChanged")); } if (table.PrimaryKey != null) { var constructor = new ClassConstructorDefinition { AccessModifier = AccessModifier.Public }; foreach (var key in table.GetColumnsFromConstraint(table.PrimaryKey)) { var col = (Column)key; var propertyType = project.Database.ResolveDatabaseType(col); constructor.Parameters.Add(new ParameterDefinition(propertyType, project.GetParameterName(col))); constructor.Lines.Add(new CodeLine("{0} = {1};", project.GetPropertyName(key.Name), project.GetParameterName(col))); } definition.Constructors.Add(constructor); } var columns = table.Columns; foreach (var column in columns) { var propertyType = project.Database.ResolveDatabaseType(column); if (projectSelection.Settings.EnableDataBindings) { definition.AddViewModelProperty(propertyType, project.GetPropertyName(table, column)); } else { if (projectSelection.Settings.BackingFields.Contains(table.GetFullColumnName(column))) { definition.AddPropertyWithField(propertyType, project.GetPropertyName(table, column)); } else if (projectSelection.Settings.UseAutomaticPropertiesForEntities) { definition.Properties.Add(new PropertyDefinition { AccessModifier = AccessModifier.Public, Type = propertyType, Name = project.GetPropertyName(table, column), IsAutomatic = true }); } else { definition.AddPropertyWithField(propertyType, project.GetPropertyName(table, column)); } } } if (projectSelection.Settings.AuditEntity == null) { definition.Implements.Add(projectSelection.Settings.EntityInterfaceName); } else { var count = 0; foreach (var column in columns) { if (projectSelection.Settings.AuditEntity.Names.Contains(column.Name)) { count += 1; } } if (count == projectSelection.Settings.AuditEntity.Names.Count()) { definition.Implements.Add("IAuditEntity"); } else { definition.Implements.Add("IEntity"); } } if (projectSelection.Settings.SimplifyDataTypes) { definition.SimplifyDataTypes(); } if (projectSelection.Settings.DeclareNavigationProperties) { foreach (var foreignKey in table.ForeignKeys) { var foreignTable = project.Database.FindTable(foreignKey.References); if (foreignTable == null) { continue; } if (definition.Namespace != project.GetEntityLayerNamespace(foreignTable.Schema)) { definition.Namespaces .AddUnique(project.Database.HasDefaultSchema(foreignTable) ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(foreignTable.Schema)); } var fkProperty = foreignKey.GetParentNavigationProperty(foreignTable, project); if (!definition.Properties.Any(item => item.Name == fkProperty.Name)) { definition.Properties.Add(fkProperty); } } foreach (var child in project.Database.Tables) { foreach (var foreignKey in child.ForeignKeys) { if (foreignKey.References.EndsWith(table.FullName)) { definition.Namespaces .AddUnique(projectSelection.Settings.NavigationPropertyEnumerableNamespace); if (definition.Namespace != project.GetEntityLayerNamespace(child.Schema)) { definition.Namespaces .AddUnique(project.Database.HasDefaultSchema(child) ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(child.Schema)); } var navigationProperty = project.GetChildNavigationProperty(projectSelection, child, foreignKey); if (!definition.Properties.Any(item => item.Name == navigationProperty.Name)) { definition.Properties.Add(navigationProperty); } } } } } return(definition); }
public static DbContextClassDefinition GetDbContextClassDefinition(this EntityFrameworkCoreProject project, ProjectSelection <EntityFrameworkCoreProjectSettings> projectSelection) { var definition = new DbContextClassDefinition { Namespaces = { "System", "Microsoft.EntityFrameworkCore", project.GetEntityLayerNamespace() }, Namespace = project.GetDataLayerNamespace(), AccessModifier = AccessModifier.Public, Name = project.GetDbContextName(project.Database), BaseClass = "DbContext" }; if (!projectSelection.Settings.UseDataAnnotations) { definition.Namespaces.Add(project.GetDataLayerConfigurationsNamespace()); } definition.Constructors.Add(new ClassConstructorDefinition { AccessModifier = AccessModifier.Public, Parameters = { new ParameterDefinition(string.Format("DbContextOptions<{0}>", definition.Name), "options") }, Invocation = "base(options)" }); definition.Methods.Add(GetOnModelCreatingMethod(project)); foreach (var table in project.Database.Tables) { if (!project.Database.HasDefaultSchema(table)) { definition.Namespaces.AddUnique(project.GetEntityLayerNamespace(table.Schema)); } var existingViews = project.Database.Views.Count(item => item.Name == table.Name); var genericTypeName = existingViews == 0 ? project.GetEntityName(table) : project.GetFullEntityName(table); var name = existingViews == 0 ? project.GetDbSetPropertyName(table) : project.GetFullDbSetPropertyName(table); definition.Properties.Add( new PropertyDefinition { AccessModifier = AccessModifier.Public, Type = string.Format("DbSet<{0}>", genericTypeName), Name = name, IsAutomatic = true } ); } foreach (var view in project.Database.Views) { if (!project.Database.HasDefaultSchema(view)) { definition.Namespaces.AddUnique(project.GetEntityLayerNamespace(view.Schema)); } var existingTables = project.Database.Tables.Count(item => item.Name == view.Name); var genericTypeName = existingTables == 0 ? project.GetEntityName(view) : project.GetFullEntityName(view); var name = existingTables == 0 ? project.GetDbSetPropertyName(view) : project.GetFullDbSetPropertyName(view); definition.Properties.Add( new PropertyDefinition { AccessModifier = AccessModifier.Public, Type = string.Format("DbSet<{0}>", genericTypeName), Name = name, IsAutomatic = true } ); } foreach (var table in project.Database.Tables) { if (!projectSelection.Settings.UseDataAnnotations && !project.Database.HasDefaultSchema(table)) { definition.Namespaces.AddUnique(project.GetDataLayerConfigurationsNamespace(table.Schema)); } } foreach (var view in project.Database.Views) { if (!projectSelection.Settings.UseDataAnnotations && !project.Database.HasDefaultSchema(view)) { definition.Namespaces.AddUnique(project.GetDataLayerConfigurationsNamespace(view.Schema)); } } foreach (var scalarFunction in project.Database.ScalarFunctions) { var parameterType = string.Empty; if (project.Database.HasTypeMappedToClr(scalarFunction.Parameters[0])) { var clrType = project.Database.GetClrMapForType(scalarFunction.Parameters[0]); parameterType = clrType.AllowClrNullable ? string.Format("{0}?", clrType.GetClrType().Name) : clrType.GetClrType().Name; } else { parameterType = "object"; } var method = new MethodDefinition { Attributes = { new MetadataAttribute("DbFunction") { Sets = { new MetadataAttributeSet("FunctionName", string.Format("\"{0}\"", scalarFunction.Name)), new MetadataAttributeSet("Schema", string.Format("\"{0}\"", scalarFunction.Schema)) } } }, IsStatic = true, Type = parameterType, AccessModifier = AccessModifier.Public, Name = project.GetScalarFunctionMethodName(scalarFunction), Lines = { new CodeLine("throw new Exception();") } }; var parameters = scalarFunction.Parameters.Where(item => !string.IsNullOrEmpty(item.Name)).ToList(); foreach (var parameter in parameters) { var propertyType = project.Database.ResolveDatabaseType(parameter); method.Parameters.Add(new ParameterDefinition(parameterType, project.GetPropertyName(parameter))); } definition.Methods.Add(method); } if (projectSelection.Settings.SimplifyDataTypes) { definition.SimplifyDataTypes(); } return(definition); }
public static CSharpClassDefinition GetEntityTypeConfigurationClassDefinition(this EntityFrameworkCoreProject project, IView view) { var definition = new CSharpClassDefinition { Namespaces = { "Microsoft.EntityFrameworkCore", "Microsoft.EntityFrameworkCore.Metadata.Builders" }, Namespace = project.GetDataLayerConfigurationsNamespace(), Name = project.GetEntityConfigurationName(view), Implements = { string.Format("IEntityTypeConfiguration<{0}>", project.GetEntityName(view)) } }; definition.Namespaces.AddUnique(project.GetEntityLayerNamespace(project.Database.HasDefaultSchema(view) ? string.Empty : view.Schema)); var configLines = new List <ILine> { new CommentLine(" Set configuration for entity") }; if (string.IsNullOrEmpty(view.Schema)) { configLines.Add(new CodeLine("builder.ToTable(\"{0}\");", view.Name)); } else { configLines.Add(new CodeLine("builder.ToTable(\"{0}\", \"{1}\");", view.Name, view.Schema)); } configLines.Add(new CodeLine()); var primaryKeys = project.Database.Tables.Where(item => item.PrimaryKey != null).Select(item => item.GetColumnsFromConstraint(item.PrimaryKey).Select(c => c.Name).First()).ToList(); var result = view.Columns.Where(item => primaryKeys.Contains(item.Name)).ToList(); if (result.Count == 0) { result = view.Columns.Where(item => !item.Nullable).ToList(); } configLines.Add(new CommentLine(" Add configuration for entity's key")); configLines.Add(new CodeLine("builder.HasKey(p => new {{ {0} }});", string.Join(", ", result.Select(item => string.Format("p.{0}", definition.NamingConvention.GetPropertyName(item.Name)))))); configLines.Add(new CodeLine()); configLines.Add(new CommentLine(" Set configuration for columns")); for (var i = 0; i < view.Columns.Count; i++) { var column = view.Columns[i]; if (project.Database.HasTypeMappedToClr(column)) { var lines = new List <string> { string.Format("builder.Property(p => p.{0})", view.GetPropertyNameHack(column)) }; if (string.Compare(column.Name, column.GetPropertyName()) != 0) { lines.Add(string.Format("HasColumnName(\"{0}\")", column.Name)); } if (project.Database.ColumnIsString(column)) { lines.Add(column.Length <= 0 ? string.Format("HasColumnType(\"{0}(max)\")", column.Type) : string.Format("HasColumnType(\"{0}({1})\")", column.Type, column.Length)); } else if (project.Database.ColumnIsDecimal(column)) { lines.Add(string.Format("HasColumnType(\"{0}({1}, {2})\")", column.Type, column.Prec, column.Scale)); } else if (project.Database.ColumnIsDouble(column) || project.Database.ColumnIsSingle(column)) { lines.Add(string.Format("HasColumnType(\"{0}({1})\")", column.Type, column.Prec)); } else { lines.Add(string.Format("HasColumnType(\"{0}\")", column.Type)); } configLines.Add(new CodeLine("{0};", string.Join(".", lines))); } else { var lines = new List <string> { string.Format("builder.Ignore(p => p.{0})", view.GetPropertyNameHack(column)) }; configLines.Add(new CodeLine("{0};", string.Join(".", lines))); } } definition.Methods.Add(new MethodDefinition("void", "Configure", new ParameterDefinition(string.Format("EntityTypeBuilder<{0}>", project.GetEntityName(view)), "builder")) { Lines = configLines }); return(definition); }
public static EntityClassDefinition GetEntityClassDefinition(this EntityFrameworkCoreProject project, ITable table) { var definition = new EntityClassDefinition { Namespaces = { "System" }, Namespace = project.Database.HasDefaultSchema(table) ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(table.Schema), Name = project.GetEntityName(table), IsPartial = true, Constructors = { new ClassConstructorDefinition() } }; if (!string.IsNullOrEmpty(table.Description)) { definition.Documentation.Summary = table.Description; } var projectSelection = project.GetSelection(table); if (projectSelection.Settings.UseDataAnnotations) { definition.Namespaces.Add("System.ComponentModel.DataAnnotations"); definition.Namespaces.Add("System.ComponentModel.DataAnnotations.Schema"); } if (projectSelection.Settings.EnableDataBindings) { definition.Namespaces.Add("System.ComponentModel"); definition.Implements.Add("INotifyPropertyChanged"); definition.Events.Add(new EventDefinition("PropertyChangedEventHandler", "PropertyChanged")); } if (table.PrimaryKey != null) { var constructor = new ClassConstructorDefinition(); foreach (var key in table.GetColumnsFromConstraint(table.PrimaryKey)) { var propertyType = string.Empty; if (project.Database.HasTypeMappedToClr(key)) { var clrType = project.Database.GetClrMapForType(key); propertyType = clrType.AllowClrNullable ? string.Format("{0}?", clrType.GetClrType().Name) : clrType.GetClrType().Name; } else { propertyType = "object"; } constructor.Parameters.Add(new ParameterDefinition(propertyType, project.GetParameterName(key))); constructor.Lines.Add(new CodeLine("{0} = {1};", key.GetPropertyName(), project.GetParameterName(key))); } definition.Constructors.Add(constructor); } var columns = table.Columns; foreach (var column in columns) { var propertyType = string.Empty; if (project.Database.HasTypeMappedToClr(column)) { var clrType = project.Database.GetClrMapForType(column); propertyType = clrType.AllowClrNullable ? string.Format("{0}?", clrType.GetClrType().Name) : clrType.GetClrType().Name; } else { propertyType = "object"; } if (projectSelection.Settings.EnableDataBindings) { definition.AddViewModelProperty(propertyType, column.HasSameNameEnclosingType(table) ? column.GetNameForEnclosing() : table.GetPropertyNameHack(column)); } else { if (projectSelection.Settings.BackingFields.Contains(table.GetFullColumnName(column))) { definition.AddPropertyWithField(propertyType, column.HasSameNameEnclosingType(table) ? column.GetNameForEnclosing() : table.GetPropertyNameHack(column)); } else if (projectSelection.Settings.UseAutomaticPropertiesForEntities) { definition.Properties.Add(new PropertyDefinition(propertyType, column.HasSameNameEnclosingType(table) ? column.GetNameForEnclosing() : table.GetPropertyNameHack(column))); } else { definition.AddPropertyWithField(propertyType, column.HasSameNameEnclosingType(table) ? column.GetNameForEnclosing() : table.GetPropertyNameHack(column)); } } } if (projectSelection.Settings.AuditEntity == null) { definition.Implements.Add(projectSelection.Settings.EntityInterfaceName); } else { var count = 0; foreach (var column in columns) { if (projectSelection.Settings.AuditEntity.Names.Contains(column.Name)) { count += 1; } } if (count == projectSelection.Settings.AuditEntity.Names.Length) { definition.Implements.Add("IAuditEntity"); } else { definition.Implements.Add("IEntity"); } } if (projectSelection.Settings.SimplifyDataTypes) { definition.SimplifyDataTypes(); } if (projectSelection.Settings.DeclareNavigationProperties) { foreach (var foreignKey in table.ForeignKeys) { var foreignTable = project.Database.FindTable(foreignKey.References); if (foreignTable == null) { continue; } definition.Namespaces .AddUnique(project.Database.HasDefaultSchema(foreignTable) ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(foreignTable.Schema)); definition.Namespace = project.Database.HasDefaultSchema(table) ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(table.Schema); var fkProperty = foreignKey.GetParentNavigationProperty(foreignTable, project); if (definition.Properties.FirstOrDefault(item => item.Name == fkProperty.Name) == null) { definition.Properties.Add(fkProperty); } } foreach (var child in project.Database.Tables) { foreach (var foreignKey in child.ForeignKeys) { if (foreignKey.References.EndsWith(table.FullName)) { definition.Namespaces .AddUnique(projectSelection.Settings.NavigationPropertyEnumerableNamespace); definition.Namespaces .AddUnique(project.Database.HasDefaultSchema(child) ? project.GetEntityLayerNamespace() : project.GetEntityLayerNamespace(child.Schema)); var navigationProperty = project.GetChildNavigationProperty(projectSelection, child, foreignKey); if (definition.Properties.FirstOrDefault(item => item.Name == navigationProperty.Name) == null) { definition.Properties.Add(navigationProperty); } } } } } return(definition); }
public static CSharpClassDefinition GetEntityTypeConfigurationClassDefinition(this EntityFrameworkCoreProject project, ITable table) { var classDefinition = new CSharpClassDefinition(); if (project.Settings.UseMefForEntitiesMapping) { classDefinition.Namespaces.Add("System.Composition"); classDefinition.Attributes.Add(new MetadataAttribute("Export", "typeof(IEntityTypeConfiguration)")); } classDefinition.Namespaces.Add("Microsoft.EntityFrameworkCore"); classDefinition.Namespaces.AddUnique(project.GetEntityLayerNamespace(table.HasDefaultSchema() ? string.Empty : table.Schema)); classDefinition.Namespace = project.GetDataLayerConfigurationsNamespace(); classDefinition.Name = table.GetEntityTypeConfigurationName(); classDefinition.Implements.Add("IEntityTypeConfiguration"); var mapLines = new List <ILine>(); mapLines.Add(new CodeLine("modelBuilder.Entity<{0}>(builder =>", table.GetSingularName())); mapLines.Add(new CodeLine("{")); mapLines.Add(new CommentLine(1, " Set configuration for entity")); if (string.IsNullOrEmpty(table.Schema)) { mapLines.Add(new CodeLine(1, "builder.ToTable(\"{0}\");", table.Name)); } else { mapLines.Add(new CodeLine(1, "builder.ToTable(\"{0}\", \"{1}\");", table.Name, table.Schema)); } mapLines.Add(new CodeLine()); var columns = default(List <Column>); if (table.PrimaryKey == null || table.PrimaryKey.Key.Count == 0) { mapLines.Add(LineHelper.Warning("Add configuration for entity's key")); mapLines.Add(new CodeLine()); } else { mapLines.Add(new CommentLine(1, " Set key for entity")); if (table.PrimaryKey.Key.Count == 1) { mapLines.Add(new CodeLine(1, "builder.HasKey(p => p.{0});", classDefinition.NamingConvention.GetPropertyName(table.PrimaryKey.Key[0]))); mapLines.Add(new CodeLine()); } else if (table.PrimaryKey.Key.Count > 1) { mapLines.Add(new CodeLine(1, "builder.HasKey(p => new {{ {0} }});", string.Join(", ", table.PrimaryKey.Key.Select(item => string.Format("p.{0}", classDefinition.NamingConvention.GetPropertyName(item)))))); mapLines.Add(new CodeLine()); } } if (table.Identity != null) { mapLines.Add(new CommentLine(1, " Set identity for entity (auto increment)")); mapLines.Add(new CodeLine(1, "builder.Property(p => p.{0}).UseSqlServerIdentityColumn();", classDefinition.NamingConvention.GetPropertyName(table.Identity.Name))); mapLines.Add(new CodeLine()); } columns = table.Columns; mapLines.Add(new CommentLine(1, " Set configuration for columns")); for (var i = 0; i < columns.Count; i++) { var column = columns[i]; var lines = new List <string>() { string.Format("builder.Property(p => p.{0})", column.GetPropertyName()) }; if (string.Compare(column.Name, column.GetPropertyName()) != 0) { lines.Add(string.Format("HasColumnName(\"{0}\")", column.Name)); } if (column.IsString()) { lines.Add(column.Length == 0 ? string.Format("HasColumnType(\"{0}(max)\")", column.Type) : string.Format("HasColumnType(\"{0}({1})\")", column.Type, column.Length)); } else if (column.IsDecimal()) { lines.Add(string.Format("HasColumnType(\"{0}({1}, {2})\")", column.Type, column.Prec, column.Scale)); } else if (column.IsDouble() || column.IsSingle()) { lines.Add(string.Format("HasColumnType(\"{0}({1})\")", column.Type, column.Prec)); } else { lines.Add(string.Format("HasColumnType(\"{0}\")", column.Type)); } if (!column.Nullable) { lines.Add("IsRequired()"); } mapLines.Add(new CodeLine(1, "{0};", string.Join(".", lines))); } mapLines.Add(new CodeLine()); for (var i = 0; i < columns.Count; i++) { var column = columns[i]; if (!string.IsNullOrEmpty(project.Settings.ConcurrencyToken) && string.Compare(column.Name, project.Settings.ConcurrencyToken) == 0) { mapLines.Add(new CommentLine(1, " Set concurrency token for entity")); mapLines.Add(new CodeLine(1, "builder")); mapLines.Add(new CodeLine(2, ".Property(p => p.{0})", column.GetPropertyName())); mapLines.Add(new CodeLine(2, ".ValueGeneratedOnAddOrUpdate()")); mapLines.Add(new CodeLine(2, ".IsConcurrencyToken();")); mapLines.Add(new CodeLine()); } } if (table.Uniques.Count > 0) { mapLines.Add(new CommentLine(1, " Add configuration for uniques")); foreach (var unique in table.Uniques) { mapLines.Add(new CodeLine(1, "builder")); if (unique.Key.Count == 1) { mapLines.Add(new CodeLine(2, ".HasIndex(p => p.{0})", classDefinition.NamingConvention.GetPropertyName(unique.Key.First()))); mapLines.Add(new CodeLine(2, ".IsUnique()")); } else { mapLines.Add(new CodeLine(2, ".HasIndex(p => new {{ {0} }})", string.Join(", ", table.PrimaryKey.Key.Select(item => string.Format("p.{0}", classDefinition.NamingConvention.GetPropertyName(item)))))); mapLines.Add(new CodeLine(2, ".IsUnique()")); } mapLines.Add(new CodeLine(2, ".HasName(\"{0}\");", unique.ConstraintName)); mapLines.Add(new CodeLine()); } } if (table.ForeignKeys.Count > 0) { mapLines.Add(new CommentLine(1, " Add configuration for foreign keys")); foreach (var foreignKey in table.ForeignKeys) { var foreignTable = project.Database.FindTableByFullName(foreignKey.References); if (foreignTable == null) { continue; } if (foreignKey.Key.Count == 0) { continue; } else if (foreignKey.Key.Count == 1) { var foreignProperty = foreignKey.GetParentNavigationProperty(project, foreignTable); mapLines.Add(new CodeLine(1, "builder")); mapLines.Add(new CodeLine(2, ".HasOne(p => p.{0})", foreignProperty.Name)); mapLines.Add(new CodeLine(2, ".WithMany(b => b.{0})", table.GetPluralName())); mapLines.Add(new CodeLine(2, ".HasForeignKey(p => {0})", string.Format("p.{0}", classDefinition.NamingConvention.GetPropertyName(foreignKey.Key[0])))); mapLines.Add(new CodeLine(2, ".HasConstraintName(\"{0}\");", foreignKey.ConstraintName)); mapLines.Add(new CodeLine()); } else { mapLines.Add(LineHelper.Warning(" Add logic for foreign key with multiple key")); } } } mapLines.Add(new CodeLine("});")); var mapMethod = new MethodDefinition("void", "Configure", new ParameterDefinition("ModelBuilder", "modelBuilder")) { Lines = mapLines }; classDefinition.Methods.Add(mapMethod); return(classDefinition); }
public static CSharpClassDefinition GetEntityTypeConfigurationClassDefinition(this EntityFrameworkCoreProject project, IView view) { var classDefinition = new CSharpClassDefinition(); if (project.Settings.UseMefForEntitiesMapping) { classDefinition.Namespaces.Add("System.Composition"); classDefinition.Attributes.Add(new MetadataAttribute("Export", "typeof(IEntityTypeConfiguration)")); } classDefinition.Namespaces.Add("Microsoft.EntityFrameworkCore"); classDefinition.Namespaces.AddUnique(project.GetEntityLayerNamespace(view.HasDefaultSchema() ? string.Empty : view.Schema)); classDefinition.Namespace = project.GetDataLayerConfigurationsNamespace(); classDefinition.Name = view.GetEntityTypeConfigurationName(); classDefinition.Implements.Add("IEntityTypeConfiguration"); var mapLines = new List <ILine>(); mapLines.Add(new CodeLine("modelBuilder.Entity<{0}>(builder =>", view.GetSingularName())); mapLines.Add(new CodeLine("{")); mapLines.Add(new CommentLine(1, " Set configuration for entity")); if (string.IsNullOrEmpty(view.Schema)) { mapLines.Add(new CodeLine(1, "builder.ToTable(\"{0}\");", view.Name)); } else { mapLines.Add(new CodeLine(1, "builder.ToTable(\"{0}\", \"{1}\");", view.Name, view.Schema)); } mapLines.Add(new CodeLine()); var primaryKeys = project.Database.Tables.Where(item => item.PrimaryKey != null).Select(item => item.PrimaryKey?.GetColumns(item).Select(c => c.Name).First()).ToList(); var result = view.Columns.Where(item => !item.Nullable && primaryKeys.Contains(item.Name)).ToList(); if (result.Count == 0) { result = view.Columns.Where(item => !item.Nullable).ToList(); } mapLines.Add(new CommentLine(1, " Add configuration for entity's key")); mapLines.Add(new CodeLine(1, "builder.HasKey(p => new {{ {0} }});", string.Join(", ", result.Select(item => string.Format("p.{0}", classDefinition.NamingConvention.GetPropertyName(item.Name)))))); mapLines.Add(new CodeLine()); mapLines.Add(new CommentLine(1, " Set configuration for columns")); for (var i = 0; i < view.Columns.Count; i++) { var column = view.Columns[i]; var lines = new List <string>() { string.Format("builder.Property(p => p.{0})", column.GetPropertyName()) }; if (string.Compare(column.Name, column.GetPropertyName()) != 0) { lines.Add(string.Format("HasColumnName(\"{0}\")", column.Name)); } if (column.IsString()) { lines.Add(column.Length == 0 ? string.Format("HasColumnType(\"{0}(max)\")", column.Type) : string.Format("HasColumnType(\"{0}({1})\")", column.Type, column.Length)); } else if (column.IsDecimal()) { lines.Add(string.Format("HasColumnType(\"{0}({1}, {2})\")", column.Type, column.Prec, column.Scale)); } else if (column.IsDouble() || column.IsSingle()) { lines.Add(string.Format("HasColumnType(\"{0}({1})\")", column.Type, column.Prec)); } else { lines.Add(string.Format("HasColumnType(\"{0}\")", column.Type)); } mapLines.Add(new CodeLine(1, "{0};", string.Join(".", lines))); } mapLines.Add(new CodeLine("});")); var mapMethod = new MethodDefinition("void", "Configure", new ParameterDefinition("ModelBuilder", "modelBuilder")) { Lines = mapLines }; classDefinition.Methods.Add(mapMethod); return(classDefinition); }