Skip to content

Script Templates

Entity Framework Core Generator supports external csx script templates. Script templates allow you to create custom templates to generate code based on the database model.

Script Global Variables

The script execution context contains the following global variables

GeneratorOptions

The generator options containing all the setting for the generator.

TemplateOptions

Options for the current template loaded from the overall generator options

CodeBuilder

A string builder that supports indentation for writing code

Script Types

Context Script Template

Context script templates have a global variable of EntityContext that contains the full database model. Use this script type to generate something that applies to the full model.

Entity Script Template

Entity script templates have a global variable of Entity that contains the current entity being generated. Use this script type to generate something that applies to each entity.

Example Entity Template

public string WriteCode()
{
    CodeBuilder.Clear();

    CodeBuilder.Append("EntityClass: ").Append(Entity.EntityClass).AppendLine();
    CodeBuilder.Append("EntityNamespace: '").Append(Entity.EntityNamespace).AppendLine("'");
    CodeBuilder.Append("EntityBaseClass: ").Append(Entity.EntityBaseClass).AppendLine();

    CodeBuilder.Append("ContextProperty: ").Append(Entity.ContextProperty).AppendLine();

    CodeBuilder.Append("TableSchema: '").Append(Entity.TableSchema).AppendLine("'");
    CodeBuilder.Append("TableName: '").Append(Entity.TableName).AppendLine("'");


    CodeBuilder.Append("MappingClass: ").Append(Entity.MappingClass).AppendLine();
    CodeBuilder.Append("MappingNamespace: '").Append(Entity.MappingNamespace).AppendLine("'");

    CodeBuilder.Append("MapperClass: ").Append(Entity.MapperClass).AppendLine();
    CodeBuilder.Append("MapperNamespace: '").Append(Entity.MapperClass).AppendLine("'");
    CodeBuilder.Append("MapperBaseClass: ").Append(Entity.MapperBaseClass).AppendLine();

    CodeBuilder.Append("IsView: ").Append(Entity.IsView).AppendLine();

    CodeBuilder.Append("Properties:").AppendLine();
    using (CodeBuilder.Indent())
        GenerateProperties();

    return CodeBuilder.ToString();
}

private void GenerateProperties()
{
    foreach (var property in Entity.Properties)
    {
        CodeBuilder.Append("- PropertyName: ").Append(property.PropertyName).AppendLine();
        CodeBuilder.Append("  ColumnName: '").Append(property.ColumnName).AppendLine("'");
        CodeBuilder.Append("  StoreType: ").Append(property.StoreType).AppendLine();
        CodeBuilder.Append("  NativeType: '").Append(property.NativeType).AppendLine("'");
        CodeBuilder.Append("  DataType: ").Append(property.DataType).AppendLine();
        CodeBuilder.Append("  SystemType: ").Append(property.SystemType.Name).AppendLine();

        if (property.Size != null)
            CodeBuilder.Append("  Size: ").Append(property.Size).AppendLine();

        if (property.Default != null)
            CodeBuilder.Append("  Default: '").Append(property.Default).AppendLine("'");

        if (property.ValueGenerated != null)
            CodeBuilder.Append("  ValueGenerated: ").Append(property.ValueGenerated).AppendLine();

        if (property.IsNullable != null)
            CodeBuilder.Append("  IsNullable: ").Append(property.IsNullable).AppendLine();

        if (property.IsPrimaryKey != null)
            CodeBuilder.Append("  IsPrimaryKey: ").Append(property.IsPrimaryKey).AppendLine();

        if (property.IsForeignKey != null)
            CodeBuilder.Append("  IsForeignKey: ").Append(property.IsForeignKey).AppendLine();

        if (property.IsReadOnly != null)
            CodeBuilder.Append("  IsReadOnly: ").Append(property.IsReadOnly).AppendLine();

        if (property.IsRowVersion != null)
            CodeBuilder.Append("  IsRowVersion: ").Append(property.IsRowVersion).AppendLine();

        if (property.IsUnique != null)
            CodeBuilder.Append("  IsUnique: ").Append(property.IsUnique).AppendLine();
    }
}

// run script
WriteCode()

Model Script Template

Model script templates have a global variable of Model that contains the current model being generated. Use this script type to generate something that applies to each model.

Example Model Template

public string WriteCode()
{
    CodeBuilder.Clear();

    CodeBuilder.Append("ModelClass: ").Append(Model.ModelClass).AppendLine();
    CodeBuilder.Append("ModelType: ").Append(Model.ModelType).AppendLine();
    CodeBuilder.Append("ModelNamespace: '").Append(Model.ModelNamespace).AppendLine("'");
    CodeBuilder.Append("ModelBaseClass: ").Append(Model.ModelBaseClass).AppendLine();
    CodeBuilder.Append("ValidatorNamespace: '").Append(Model.ValidatorNamespace).AppendLine("'");
    CodeBuilder.Append("ValidatorClass: ").Append(Model.ValidatorClass).AppendLine();
    CodeBuilder.Append("ValidatorBaseClass: ").Append(Model.ValidatorBaseClass).AppendLine();

    CodeBuilder.Append("Properties:").AppendLine();
    using (CodeBuilder.Indent())
        GenerateProperties();

    return CodeBuilder.ToString();
}

private void GenerateProperties()
{
    foreach (var property in Model.Properties)
    {
        CodeBuilder.Append("- PropertyName: ").Append(property.PropertyName).AppendLine();
        CodeBuilder.Append("  ColumnName: '").Append(property.ColumnName).AppendLine("'");
        CodeBuilder.Append("  StoreType: ").Append(property.StoreType).AppendLine();
        CodeBuilder.Append("  NativeType: '").Append(property.NativeType).AppendLine("'");
        CodeBuilder.Append("  DataType: ").Append(property.DataType).AppendLine();
        CodeBuilder.Append("  SystemType: ").Append(property.SystemType.Name).AppendLine();

        if (property.Size != null)
            CodeBuilder.Append("  Size: ").Append(property.Size).AppendLine();

        if (property.Default != null)
            CodeBuilder.Append("  Default: '").Append(property.Default).AppendLine("'");

        if (property.ValueGenerated != null)
            CodeBuilder.Append("  ValueGenerated: ").Append(property.ValueGenerated).AppendLine();

        if (property.IsNullable != null)
            CodeBuilder.Append("  IsNullable: ").Append(property.IsNullable).AppendLine();

        if (property.IsPrimaryKey != null)
            CodeBuilder.Append("  IsPrimaryKey: ").Append(property.IsPrimaryKey).AppendLine();

        if (property.IsForeignKey != null)
            CodeBuilder.Append("  IsForeignKey: ").Append(property.IsForeignKey).AppendLine();

        if (property.IsReadOnly != null)
            CodeBuilder.Append("  IsReadOnly: ").Append(property.IsReadOnly).AppendLine();

        if (property.IsRowVersion != null)
            CodeBuilder.Append("  IsRowVersion: ").Append(property.IsRowVersion).AppendLine();

        if (property.IsUnique != null)
            CodeBuilder.Append("  IsUnique: ").Append(property.IsUnique).AppendLine();
    }
}

// run script
WriteCode()

Configuration

Example configuration

script:
  entity:
    - templatePath: '.\Templates\entity-yaml.csx'
      fileName: '{Entity.Name}.yml'
      directory: '{Project.Directory}\Yaml\Entity'
      overwrite: false
      merge: true
  model:
    - templatePath: '.\Templates\model-yaml.csx'
      fileName: '{Model.Name}.yml'
      directory: '{Project.Directory}\Yaml\Model'
      overwrite: false
      merge: true

TemplatePath

The file path to the script template. Variables Supported

FileName

The file name to save script output. Variables Supported

Namespace

The namespace for the script template. Variables Supported

BaseClass

The base class for the script template. Variables Supported

Directory

The directory location to write script template output. Variables Supported

Overwrite

Flag indicating whether to overwrite existing file. Default: false

Merge

Flag indicating whether to merge regions with existing file. Default: false