コード例 #1
0
        public SavedModelFiles Save(ScaffoldedModel scaffoldedModel, string outputDir, string nameSpace)
        {
            Directory.CreateDirectory(outputDir);

            var contextPath = Path.GetFullPath(Path.Combine(outputDir, scaffoldedModel.ContextFile.Path));

            Directory.CreateDirectory(Path.GetDirectoryName(contextPath));
            File.WriteAllText(contextPath, scaffoldedModel.ContextFile.Code, Encoding.UTF8);

            var additionalFiles = new List <string>();

            foreach (var entityTypeFile in scaffoldedModel.AdditionalFiles)
            {
                var additionalFilePath = Path.Combine(outputDir, entityTypeFile.Path);
                Directory.CreateDirectory(Path.GetDirectoryName(additionalFilePath));
                File.WriteAllText(additionalFilePath, entityTypeFile.Code, Encoding.UTF8);
                additionalFiles.Add(additionalFilePath);
            }

            return(new SavedModelFiles(contextPath, additionalFiles));
        }
コード例 #2
0
        public ScaffoldedModel ScaffoldModel(FunctionModel model, ModuleScaffolderOptions scaffolderOptions, ref List <string> errors)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            var result = new ScaffoldedModel();

            errors = model.Errors;

            var dbContext = WriteFunctionsClass(scaffolderOptions, model);

            result.ContextFile = new ScaffoldedFile
            {
                Code = dbContext,
                Path = Path.GetFullPath(Path.Combine(scaffolderOptions.ContextDir, scaffolderOptions.ContextName + ".Functions.cs")),
            };

            return(result);
        }
コード例 #3
0
ファイル: CodeController.cs プロジェクト: Kounty2Rolen/Diplom
        public Tempproj GenerateTempProject(ConectionData data, string ending, ScaffoldedModel models)
        {
            DiplomWork.Model.Context context     = new Model.Context();
            Model.TempProjects       tempProject = new Model.TempProjects();
            tempProject.ConnectionString = data.ConnectionString;
            tempProject.ContextName      = data.ContextName;
            tempProject.ProjectName      = data.ProjName;
            Tempproj tempproj = new Tempproj();

            context.Add(tempProject);
            tempproj.Models    = new List <string>();
            tempproj.FileNames = new List <string>();
            foreach (var file in models.AdditionalFiles)
            {
                DiplomWork.Model.Model model = new DiplomWork.Model.Model();
                model.Tempproject           = tempProject.Id;
                model.Model1                = file.Code;
                model.Filename              = Path.GetFileName(file.Path);
                model.TempprojectNavigation = tempProject;
                context.Add(model);
                context.SaveChanges();
                tempproj.FileNames.Add(Path.GetFileName(file.Path));
                tempproj.Models.Add(file.Code);
            }
            tempproj.FileNames.Add(Path.GetFileName(models.ContextFile.Path));
            tempproj.Models.Add(models.ContextFile.Code);
            DiplomWork.Model.Model Contextmodel = new DiplomWork.Model.Model();
            Contextmodel.Tempproject = tempProject.Id;
            Contextmodel.Model1      = models.ContextFile.Code;
            Contextmodel.Filename    = Path.GetFileName(models.ContextFile.Path);
            context.Add(Contextmodel);

            context.SaveChanges();
            tempproj.Id           = tempProject.Id;
            tempproj.RandomEnding = ending;
            tempproj.Data         = data;
            context.Dispose();
            return(tempproj);
        }
コード例 #4
0
        /// <summary>
        /// Generates code for a model.
        /// </summary>
        /// <param name="model">The model.</param>
        /// <param name="options">The model generatation options <see cref="ModelCodeGenerationOptions"/>.</param>
        /// <returns></returns>
        public ScaffoldedModel GenerateModel(IModel model, ModelCodeGenerationOptions options)
        {
            var files = new ScaffoldedModel();

            var contextCode = this.dbContextGenerator.WriteCode(
                model,
                options.ContextNamespace,
                options.ContextName,
                options.ConnectionString,
                options.UseDataAnnotations,
                options.SuppressConnectionStringWarning
                );

            files.ContextFile = new ScaffoldedFile
            {
                Path = Path.Combine(options.ContextDir, options.ContextName + FileExtension),
                Code = contextCode
            };

            foreach (var entityType in model.GetEntityTypes())
            {
                var entityCode = this.entityTypeGenerator.WriteCode(
                    entityType,
                    options.ContextNamespace,
                    options.UseDataAnnotations
                    );

                var entityFile = new ScaffoldedFile
                {
                    Path = entityType.DisplayName() + FileExtension,
                    Code = entityCode
                };

                files.AdditionalFiles.Add(entityFile);
            }

            return(files);
        }
コード例 #5
0
        public ScaffoldedModel ScaffoldModel(ProcedureModel model, ModuleScaffolderOptions procedureScaffolderOptions, ref List <string> errors)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            var result = new ScaffoldedModel();

            errors = model.Errors;

            foreach (var procedure in model.Procedures)
            {
                var name = GenerateIdentifierName(procedure, model) + "Result";

                var classContent = WriteResultClass(procedure, procedureScaffolderOptions, name);

                result.AdditionalFiles.Add(new ScaffoldedFile
                {
                    Code = classContent,
                    Path = procedureScaffolderOptions.UseSchemaFolders
                            ? Path.Combine(procedure.Schema, $"{name}.cs")
                            : $"{name}.cs"
                });
            }

            var dbContext = WriteProcedureDbContext(procedureScaffolderOptions, model);

            result.ContextFile = new ScaffoldedFile
            {
                Code = dbContext,
                Path = Path.GetFullPath(Path.Combine(procedureScaffolderOptions.ContextDir, procedureScaffolderOptions.ContextName + "Procedures.cs")),
            };

            return(result);
        }
コード例 #6
0
 public SavedModelFiles Save(ScaffoldedModel scaffoldedModel, string outputDir, string nameSpaceValue, bool useAsyncCalls)
 {
     throw new NotSupportedException();
 }
コード例 #7
0
        public override ScaffoldedModel GenerateModel(IModel model, ModelCodeGenerationOptions options)
        {
            var resultingFiles = new ScaffoldedModel();

            var contextGenerator = new MyDbContextGenerator
            {
                Session = new Dictionary <string, object>
                {
                    ["Model"]            = model,
                    ["ModelNamespace"]   = options.ModelNamespace,
                    ["Namespace"]        = options.ContextNamespace,
                    ["ContextName"]      = options.ContextName,
                    ["ConnectionString"] = options.ConnectionString,
                    ["SuppressConnectionStringWarning"] = options.SuppressConnectionStringWarning,
                    ["UseDataAnnotations"] = options.UseDataAnnotations,

                    ["Code"]           = _csharpHelper,
                    ["ProviderCode"]   = _providerConfigurationCodeGenerator,
                    ["AnnotationCode"] = _annotationCodeGenerator
                }
            };

            contextGenerator.Initialize();
            var generatedCode = contextGenerator.TransformText();

            var dbContextFileName = options.ContextName + ".cs";

            resultingFiles.ContextFile = new ScaffoldedFile
            {
                Path = Path.Combine(options.ContextDir, dbContextFileName),
                Code = generatedCode
            };

            foreach (var entityType in model.GetEntityTypes())
            {
                var entityGenerator = new MyEntityTypeGenerator
                {
                    Session = new Dictionary <string, object>
                    {
                        ["EntityType"]         = entityType,
                        ["Namespace"]          = options.ModelNamespace,
                        ["UseDataAnnotations"] = options.UseDataAnnotations,

                        ["Code"] = _csharpHelper
                    }
                };
                entityGenerator.Initialize();
                generatedCode = entityGenerator.TransformText();

                resultingFiles.AdditionalFiles.Add(
                    new ScaffoldedFile
                {
                    Path = entityType.Name + ".cs",
                    Code = generatedCode
                });

                var configurationGenerator = new MyEntityTypeConfigurationGenerator
                {
                    Session = new Dictionary <string, object>
                    {
                        ["EntityType"]         = entityType,
                        ["ModelNamespace"]     = options.ModelNamespace,
                        ["Namespace"]          = options.ContextNamespace,
                        ["UseDataAnnotations"] = options.UseDataAnnotations,

                        ["Code"]           = _csharpHelper,
                        ["AnnotationCode"] = _annotationCodeGenerator
                    }
                };
                configurationGenerator.Initialize();
                generatedCode = configurationGenerator.TransformText();

                resultingFiles.AdditionalFiles.Add(
                    new ScaffoldedFile
                {
                    Path = Path.Combine(options.ContextDir, entityType.Name + "Configuration.cs"),
                    Code = generatedCode
                });
            }

            return(resultingFiles);
        }
コード例 #8
0
        /// <summary>Generates code for a model.</summary>
        /// <param name="model"> The model. </param>
        /// <param name="namespace"> The namespace. </param>
        /// <param name="contextDir"> The directory of the <see cref="T:Microsoft.EntityFrameworkCore.DbContext" />. </param>
        /// <param name="contextName"> The name of the <see cref="T:Microsoft.EntityFrameworkCore.DbContext" />. </param>
        /// <param name="connectionString"> The connection string. </param>
        /// <param name="options"> The options to use during generation. </param>
        /// <returns> The generated model. </returns>
        public override ScaffoldedModel GenerateModel(IModel model,
                                                      string @namespace,
                                                      string contextDir,
                                                      string contextName,
                                                      string connectionString,
                                                      ModelCodeGenerationOptions options)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }
            if (string.IsNullOrWhiteSpace(@namespace))
            {
                throw new ArgumentNullException(nameof(@namespace));
            }
            if (contextDir == null)
            {
                throw new ArgumentNullException(nameof(contextDir));
            }
            if (string.IsNullOrWhiteSpace(contextName))
            {
                throw new ArgumentNullException(nameof(contextName));
            }
            if (string.IsNullOrWhiteSpace(connectionString))
            {
                throw new ArgumentNullException(nameof(connectionString));
            }
            if (contextDir == null)
            {
                throw new ArgumentNullException(nameof(contextDir));
            }
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            // Register Hbs helpers and partial templates
            HandlebarsHelperService.RegisterHelpers();
            DbContextTemplateService.RegisterPartialTemplates();
            EntityTypeTemplateService.RegisterPartialTemplates();

            var resultingFiles = new ScaffoldedModel();

            string generatedCode;

            if (!(CSharpDbContextGenerator is NullCSharpDbContextGenerator))
            {
                generatedCode = CSharpDbContextGenerator.WriteCode(model, @namespace, contextName, connectionString, options.UseDataAnnotations, options.SuppressConnectionStringWarning);

                var dbContextFileName = contextName + FileExtension;
                resultingFiles.ContextFile = new ScaffoldedFile {
                    Path = Path.Combine(contextDir, dbContextFileName), Code = generatedCode
                };
            }

            if (!(CSharpEntityTypeGenerator is NullCSharpEntityTypeGenerator))
            {
                foreach (var entityType in model.GetEntityTypes())
                {
                    generatedCode = CSharpEntityTypeGenerator.WriteCode(entityType, @namespace, options.UseDataAnnotations);

                    var transformedFileName = EntityTypeTransformationService.TransformEntityFileName(entityType.DisplayName());
                    var entityTypeFileName  = transformedFileName + FileExtension;
                    resultingFiles.AdditionalFiles.Add(new ScaffoldedFile {
                        Path = entityTypeFileName, Code = generatedCode
                    });
                }
            }

            return(resultingFiles);
        }
        /// <summary>
        /// <summary>Generates code for a model.</summary>
        /// </summary>
        /// <param name="model"> The model.</param>
        /// <param name="options"> The options to use during generation. </param>
        /// <returns> The generated model. </returns>
        public override ScaffoldedModel GenerateModel(IModel model, ModelCodeGenerationOptions options)
        {
            Check.NotNull(model, nameof(model));
            Check.NotNull(options, nameof(options));

            // Register Hbs helpers and partial templates
            HandlebarsHelperService.RegisterHelpers();
            HandlebarsBlockHelperService.RegisterBlockHelpers();
            DbContextTemplateService.RegisterPartialTemplates();
            EntityTypeTemplateService.RegisterPartialTemplates();

            var resultingFiles = new ScaffoldedModel();

            string generatedCode;

            if (!(CSharpDbContextGenerator is NullCSharpDbContextGenerator))
            {
                generatedCode = CSharpDbContextGenerator.WriteCode(
                    model,
                    options.ContextName,
                    options.ConnectionString,
                    options.ContextNamespace,
                    options.ModelNamespace,
                    options.UseDataAnnotations,
                    options.SuppressConnectionStringWarning,
                    options.SuppressOnConfiguring);

                var dbContextFileName = ContextTransformationService.TransformContextFileName(options.ContextName) + FileExtension;
                resultingFiles.ContextFile = new ScaffoldedFile
                {
                    Path = options.ContextDir != null
                        ? Path.Combine(options.ContextDir, dbContextFileName)
                        : dbContextFileName,
                    Code = generatedCode
                };
            }

            if (!(CSharpEntityTypeGenerator is NullCSharpEntityTypeGenerator))
            {
                foreach (var entityType in model.GetScaffoldEntityTypes(_options.Value))
                {
                    generatedCode = CSharpEntityTypeGenerator.WriteCode(
                        entityType,
                        options.ModelNamespace,
                        options.UseDataAnnotations);

                    var transformedFileName = EntityTypeTransformationService.TransformEntityFileName(entityType.DisplayName());
                    var entityTypeFileName  = _options?.Value?.EnableSchemaFolders == true
                        ? Path.Combine(CSharpHelper.Namespace(entityType.GetSchema()), transformedFileName + FileExtension)
                        : transformedFileName + FileExtension;

                    resultingFiles.AdditionalFiles.Add(
                        new ScaffoldedFile
                    {
                        Path = entityTypeFileName,
                        Code = generatedCode
                    });
                }
            }

            return(resultingFiles);
        }
コード例 #10
0
    public override ScaffoldedModel GenerateModel(IModel model, ModelCodeGenerationOptions options)
    {
        if (options.ContextName == null)
        {
            throw new ArgumentException(
                      CoreStrings.ArgumentPropertyNull(nameof(options.ContextName), nameof(options)), nameof(options));
        }

        if (options.ConnectionString == null)
        {
            throw new ArgumentException(
                      CoreStrings.ArgumentPropertyNull(nameof(options.ConnectionString), nameof(options)), nameof(options));
        }

        var resultingFiles = new ScaffoldedModel();

        var contextTemplate = Path.Combine(options.ProjectDir !, TemplatesDirectory, "DbContext.t4");

        Check.DebugAssert(_host.Session == null, "Session is not null.");
        _host.Session = _host.CreateSession();
        try
        {
            _host.Session.Add("Model", model);
            _host.Session.Add("Options", options);
            _host.Session.Add("NamespaceHint", options.ContextNamespace ?? options.ModelNamespace);
            _host.Session.Add("ProjectDefaultNamespace", options.RootNamespace);

            var handler       = new TextTemplatingCallback();
            var generatedCode = ProcessTemplate(contextTemplate, handler);

            var dbContextFileName = options.ContextName + handler.Extension;
            resultingFiles.ContextFile = new ScaffoldedFile
            {
                Path = options.ContextDir != null
                    ? Path.Combine(options.ContextDir, dbContextFileName)
                    : dbContextFileName,
                Code = generatedCode
            };
        }
        finally
        {
            _host.Session = null;
        }

        var entityTypeTemplate = Path.Combine(options.ProjectDir !, TemplatesDirectory, "EntityType.t4");

        if (File.Exists(entityTypeTemplate))
        {
            foreach (var entityType in model.GetEntityTypes())
            {
                // TODO: Should this be handled inside the template?
                if (CSharpDbContextGenerator.IsManyToManyJoinEntityType(entityType))
                {
                    continue;
                }

                _host.Session = _host.CreateSession();
                try
                {
                    _host.Session.Add("EntityType", entityType);
                    _host.Session.Add("Options", options);
                    _host.Session.Add("NamespaceHint", options.ModelNamespace);
                    _host.Session.Add("ProjectDefaultNamespace", options.RootNamespace);

                    var handler       = new TextTemplatingCallback();
                    var generatedCode = ProcessTemplate(entityTypeTemplate, handler);
                    if (string.IsNullOrWhiteSpace(generatedCode))
                    {
                        continue;
                    }

                    var entityTypeFileName = entityType.Name + handler.Extension;
                    resultingFiles.AdditionalFiles.Add(
                        new ScaffoldedFile {
                        Path = entityTypeFileName, Code = generatedCode
                    });
                }
                finally
                {
                    _host.Session = null;
                }
            }
        }

        return(resultingFiles);
    }
コード例 #11
0
        public override ScaffoldedModel GenerateModel(IModel model, ModelCodeGenerationOptions options)
        {
            var resultingFiles = new ScaffoldedModel();

            var connectionString = options.ConnectionString;

            // HACK: Work around dotnet/efcore#19799
            if (File.Exists(connectionString))
            {
                connectionString = "Data Source=(local);Initial Catalog=" + (string)model["Scaffolding:DatabaseName"];
            }

            var configurationContextFolder = options.ContextName.Replace("Context", string.Empty);

            var contextGenerator = new DbContextGenerator
            {
                Session = new Dictionary <string, object>
                {
                    ["Model"]            = model,
                    ["ContextNamespace"] = options.ContextNamespace,
                    ["ModelNamespace"]   = options.ModelNamespace,
                    ["ContextName"]      = options.ContextName,
                    ["ConnectionString"] = connectionString,
                    ["SuppressConnectionStringWarning"] = options.SuppressConnectionStringWarning,
                    ["UseDataAnnotations"] = options.UseDataAnnotations,

                    ["Code"]                       = _csharpHelper,
                    ["ProviderCode"]               = _providerConfigurationCodeGenerator,
                    ["AnnotationCode"]             = _annotationCodeGenerator,
                    ["ConfigurationContextFolder"] = configurationContextFolder,
                    ["GetEntityName"]              = (Func <IEntityType, string>)GetEntityName,
                    ["GetEntityClassName"]         = (Func <IEntityType, string>)GetEntityClassName,
                    ["GetEntityConfigurationName"] = (Func <IEntityType, string>)GetEntityConfigurationName,
                }
            };

            contextGenerator.Initialize();
            var generatedCode = contextGenerator.TransformText();

            var dbContextFileName = options.ContextName + ".cs";

            resultingFiles.ContextFile = new ScaffoldedFile
            {
                Path = Path.Combine(options.ContextDir, dbContextFileName),
                Code = generatedCode
            };

            var entityPropertyInfos = new Dictionary <EntityPropertyInfo, IProperty>();

            foreach (var entityType in model.GetEntityTypes())
            {
                var entityName      = GetEntityName(entityType);
                var entityClassName = GetEntityClassName(entityType);

                var entityGenerator = new EntityTypeGenerator
                {
                    Session = new Dictionary <string, object>
                    {
                        ["EntityType"]         = entityType,
                        ["ModelNamespace"]     = options.ModelNamespace,
                        ["UseDataAnnotations"] = options.UseDataAnnotations,

                        ["Code"]               = _csharpHelper,
                        ["EntityName"]         = entityName,
                        ["EntityClassName"]    = entityClassName,
                        ["GetEntityName"]      = (Func <IEntityType, string>)GetEntityName,
                        ["GetEntityClassName"] = (Func <IEntityType, string>)GetEntityClassName,
                    }
                };
                entityGenerator.Initialize();
                generatedCode = entityGenerator.TransformText();

                resultingFiles.AdditionalFiles.Add(
                    new ScaffoldedFile
                {
                    Path = entityClassName + ".cs",
                    Code = generatedCode
                });

                var entityConfigurationName = GetEntityConfigurationName(entityType);
                var configurationGenerator  = new EntityTypeConfigurationGenerator
                {
                    Session = new Dictionary <string, object>
                    {
                        ["EntityType"]         = entityType,
                        ["ContextNamespace"]   = options.ContextNamespace,
                        ["ModelNamespace"]     = options.ModelNamespace,
                        ["UseDataAnnotations"] = options.UseDataAnnotations,

                        ["Code"]                    = _csharpHelper,
                        ["AnnotationCode"]          = _annotationCodeGenerator,
                        ["ConfigurationNamespace"]  = string.Join(".", options.ModelNamespace, configurationContextFolder),
                        ["EntityName"]              = entityName,
                        ["EntityClassName"]         = entityClassName,
                        ["EntityConfigurationName"] = entityConfigurationName,
                    }
                };
                configurationGenerator.Initialize();
                generatedCode = configurationGenerator.TransformText();

                var configurationContextDir       = Path.Combine(options.ContextDir, configurationContextFolder);
                var configurationContextDirectory = new DirectoryInfo(configurationContextDir);
                if (!configurationContextDirectory.Exists)
                {
                    configurationContextDirectory.Create();
                }

                resultingFiles.AdditionalFiles.Add(
                    new ScaffoldedFile
                {
                    Path = Path.Combine(configurationContextDir, entityConfigurationName + ".cs"),
                    Code = generatedCode
                });

                foreach (var property in entityType.GetProperties())
                {
                    var propertyComment = property.GetComment();
                    if (string.IsNullOrEmpty(propertyComment))
                    {
                        continue;
                    }

                    if (!EntityPropertyInfo.TryGetInfo(ref propertyComment, out var entityPropertyInfo))
                    {
                        continue;
                    }

                    entityPropertyInfos[entityPropertyInfo] = property;
                }
            }

            if (entityPropertyInfos.Any())
            {
                foreach (var entityEnumInfo in entityPropertyInfos.Select(item => (item.Key.Enum, item.Value))
                         .Where(item => item.Enum != null && !string.IsNullOrEmpty(item.Enum.Name) && item.Enum.Values?.Any() == true).Distinct())
                {
                    var enumTypeGenerator = new EntityEnumTypeGenerator
                    {
                        Session = new Dictionary <string, object>
                        {
                            ["EntityEnumInfo"] = entityEnumInfo,
                            ["ModelNamespace"] = options.ModelNamespace,

                            ["Code"] = _csharpHelper,
                        }
                    };
                    enumTypeGenerator.Initialize();
                    generatedCode = enumTypeGenerator.TransformText();

                    resultingFiles.AdditionalFiles.Add(
                        new ScaffoldedFile
                    {
                        Path = entityEnumInfo.Enum.Name + ".cs",
                        Code = generatedCode
                    });
                }
            }

            return(resultingFiles);
        }
コード例 #12
0
    /// <summary>
    ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
    ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
    ///     any release. You should only use it directly in your code with extreme caution and knowing that
    ///     doing so can result in application failures when updating to a new Entity Framework Core release.
    /// </summary>
    public override ScaffoldedModel GenerateModel(
        IModel model,
        ModelCodeGenerationOptions options)
    {
        if (options.ContextName == null)
        {
            throw new ArgumentException(
                      CoreStrings.ArgumentPropertyNull(nameof(options.ContextName), nameof(options)), nameof(options));
        }

        if (options.ConnectionString == null)
        {
            throw new ArgumentException(
                      CoreStrings.ArgumentPropertyNull(nameof(options.ConnectionString), nameof(options)), nameof(options));
        }

        var generatedCode = CSharpDbContextGenerator.WriteCode(
            model,
            options.ContextName,
            options.ConnectionString,
            options.ContextNamespace,
            options.ModelNamespace,
            options.UseDataAnnotations,
            options.UseNullableReferenceTypes,
            options.SuppressConnectionStringWarning,
            options.SuppressOnConfiguring);

        // output DbContext .cs file
        var dbContextFileName = options.ContextName + FileExtension;
        var resultingFiles    = new ScaffoldedModel
        {
            ContextFile = new ScaffoldedFile
            {
                Path = options.ContextDir != null
                    ? Path.Combine(options.ContextDir, dbContextFileName)
                    : dbContextFileName,
                Code = generatedCode
            }
        };

        foreach (var entityType in model.GetEntityTypes())
        {
            if (Internal.CSharpDbContextGenerator.IsManyToManyJoinEntityType(entityType))
            {
                continue;
            }

            generatedCode = CSharpEntityTypeGenerator.WriteCode(
                entityType,
                options.ModelNamespace,
                options.UseDataAnnotations,
                options.UseNullableReferenceTypes);

            // output EntityType poco .cs file
            var entityTypeFileName = entityType.Name + FileExtension;
            resultingFiles.AdditionalFiles.Add(
                new ScaffoldedFile {
                Path = entityTypeFileName, Code = generatedCode
            });
        }

        return(resultingFiles);
    }
コード例 #13
0
        public ScaffoldedModel ScaffoldModel(RoutineModel model, ModuleScaffolderOptions scaffolderOptions, ref List <string> errors)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            if (errors == null)
            {
                throw new ArgumentNullException(nameof(errors));
            }

            if (scaffolderOptions == null)
            {
                throw new ArgumentNullException(nameof(scaffolderOptions));
            }

            var result = new ScaffoldedModel();

            errors.AddRange(model.Errors);

            foreach (var routine in model.Routines.Where(r => !(r is Function f) || !f.IsScalar))
            {
                int i = 1;

                foreach (var resultSet in routine.Results)
                {
                    if (routine.NoResultSet)
                    {
                        continue;
                    }

                    var suffix = string.Empty;
                    if (routine.Results.Count > 1)
                    {
                        suffix = $"{i++}";
                    }

                    var typeName = GenerateIdentifierName(routine, model) + "Result" + suffix;

                    var classContent = WriteResultClass(resultSet, scaffolderOptions, typeName);

                    result.AdditionalFiles.Add(new ScaffoldedFile
                    {
                        Code = classContent,
                        Path = scaffolderOptions.UseSchemaFolders
                                ? Path.Combine(routine.Schema, $"{typeName}.cs")
                                : $"{typeName}.cs",
                    });
                }
            }

            var dbContextInterface = WriteDbContextInterface(scaffolderOptions, model);

            if (!string.IsNullOrEmpty(dbContextInterface))
            {
                result.AdditionalFiles.Add(new ScaffoldedFile
                {
                    Code = dbContextInterface,
                    Path = Path.GetFullPath(Path.Combine(scaffolderOptions.ContextDir, $"I{scaffolderOptions.ContextName}Procedures.cs")),
                });
            }

            var dbContext = WriteDbContext(scaffolderOptions, model);

            result.ContextFile = new ScaffoldedFile
            {
                Code = dbContext,
                Path = Path.GetFullPath(Path.Combine(scaffolderOptions.ContextDir, scaffolderOptions.ContextName + $"{FileNameSuffix}.cs")),
            };

            return(result);
        }