{"id":23720929,"url":"https://github.com/rvegajr/ez-db-codegen-core","last_synced_at":"2025-09-03T21:31:14.604Z","repository":{"id":33934373,"uuid":"133280805","full_name":"rvegajr/ez-db-codegen-core","owner":"rvegajr","description":"Easy code generation based on a database schema.  The template language this application uses is HandleBars.","archived":false,"fork":false,"pushed_at":"2024-03-18T03:19:07.000Z","size":9154,"stargazers_count":6,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"develop","last_synced_at":"2024-11-30T14:40:07.942Z","etag":null,"topics":["c-sharp","code-generation","code-generator","database","handlebars","handlebars-template"],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rvegajr.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-05-13T22:59:01.000Z","updated_at":"2023-07-22T18:15:33.000Z","dependencies_parsed_at":"2024-11-19T16:02:27.009Z","dependency_job_id":"cffeb2d9-52eb-408e-a3ab-413c2b375f69","html_url":"https://github.com/rvegajr/ez-db-codegen-core","commit_stats":{"total_commits":278,"total_committers":5,"mean_commits":55.6,"dds":0.5035971223021583,"last_synced_commit":"ccbb09b3a9605770a677ac331f3c967609bbbd87"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rvegajr%2Fez-db-codegen-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rvegajr%2Fez-db-codegen-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rvegajr%2Fez-db-codegen-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rvegajr%2Fez-db-codegen-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rvegajr","download_url":"https://codeload.github.com/rvegajr/ez-db-codegen-core/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":231895815,"owners_count":18442361,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c-sharp","code-generation","code-generator","database","handlebars","handlebars-template"],"created_at":"2024-12-30T22:15:42.765Z","updated_at":"2025-09-03T21:31:14.591Z","avatar_url":"https://github.com/rvegajr.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ez-db-codegen-cli\n\nEzDbCodeGen now works as a local tool.  \nEasy code generation based on a database schema given by [EZDbSchema](https://github.com/rvegajr/ez-db-schema-core). The template language this application uses is HandleBars. \n\n## Getting Started\n\nThese instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system. This nuget package will dump the published cli package for code generation and a powershell script to run it. The nuget package will dump everything you need for code generation into the project you have selected under the EzDbCodeGen folder.    \n\n### Prerequisites\n* [Net 8.0+](https://www.microsoft.com/net/learn/get-started) - You will get everything you need except the sdk! Please download the latest version of this before trying to run the powershell script\n* You will need MSSQL with some database installed. If you need a sample database, feel free to look for the [World Wide Importers](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0) samples.\n\nNOTE: If you have not set your powershell execution remote policy first, you will need to do this as noted in [Powershell Execution Policy](https://www.pdq.com/blog/powershell-how-to-write-your-first-powershell-script/)\n* Open the powershell command prompt in administrator mode and type:\nSet-ExecutionPolicy RemoteSigned\n\n### Using this project:\n\n1. Navigate to an empty directory where you want to install this tool at.\n2. Using the command line: `dotnet new tool-manifest`\n3. Once this has completed:  \n   `dotnet tool install EzDbCodeGen.Cli --interactive`  \n   (or to update: `dotnet tool update EzDbCodeGen.Cli --interactive`)\n4. You will need a database that you can run the sample templates against. This utility will build the connection string, test it, download the sample files from the nuget library, copy them to the proper location, then perform the code generation as instructed by the templates.  \n   `dotnet ezdbcg` \n\n## CLI Options\n\nThe EzDbCodeGen CLI tool (`ezdbcg`) supports the following command-line options:\n\n```\nUsage: ezdbcg [options]\n\nOptions:\n  -a|--app-name \u003cNAME\u003e           Application name (default: \"MyApp\")\n  -s|--schema-name \u003cNAME\u003e        Schema name (default: \"MySchema\")\n  -t|--template \u003cPATH\u003e           Template file or directory path\n  -c|--connection-string \u003cCS\u003e    Database connection string\n  -v|--verbose                   Enable verbose output\n  -o|--output \u003cPATH\u003e             Output directory path\n  --save-settings                Save current settings for future use\n  -?|-h|--help                   Show help information\n```\n\n### Examples\n\n**Basic usage with prompts:**\n```bash\ndotnet ezdbcg\n```\nThis will prompt you for any required information that isn't provided.\n\n**Generate code with all parameters:**\n```bash\ndotnet ezdbcg -a MyApplication -s dbo -t ./Templates/Entity.hbs -c \"Server=localhost;Database=MyDB;Trusted_Connection=True;\" -o ./Output -v\n```\n\n**Save settings for future use:**\n```bash\ndotnet ezdbcg -a MyApplication -s dbo -c \"Server=localhost;Database=MyDB;Trusted_Connection=True;\" --save-settings\n```\n\n### Connection Testing\n\nThe `--test-connection` parameter allows you to validate your database connection string before running the code generation process. The tool will:\n\n1. Validate the connection string format\n2. Attempt to connect to the database server\n3. Verify database existence and accessibility\n4. Check user permissions\n\n#### Error Handling\n\nThe connection test will provide specific feedback for different failure scenarios:\n\n- Invalid connection string format\n- Database server unreachable\n- Database does not exist\n- Insufficient permissions\n- Network connectivity issues\n\nEach error will return a specific error code and descriptive message to help diagnose and fix the issue.\n\n### CLI Usage\n\n```bash\n# Basic usage\nezdbcg -t \u003ctemplate-path\u003e -c \u003cconnection-string\u003e -o \u003coutput-path\u003e\n\n# Test database connection\nezdbcg --test-connection -c \"Server=localhost;Database=MyDb;User Id=sa;Password=****\"\n\n# Additional options\nezdbcg -t \u003ctemplate-path\u003e \\\n       -c \u003cconnection-string\u003e \\\n       -o \u003coutput-path\u003e \\\n       -a MyApp \\              # Application name\n       -s MySchema \\           # Schema name\n       -v \\                    # Verbose output\n       --save-settings        # Save settings for future use\n```\n\n### In-Memory Testing\n\nFor testing purposes, EzDbCodeGen supports an in-memory mode that doesn't require a real database connection. This is particularly useful for unit tests and CI/CD pipelines.\n\n```csharp\nvar command = new CommandMainTestable\n{\n    UseInMemoryStorage = true,\n    AppName = \"TestApp\",\n    SchemaName = \"TestSchema\",\n    TemplateFileNameOrPath = \"path/to/template.hbs\",\n    ConnectionString = \"Server=localhost;Database=TestDB;User Id=test;Password=test;\"\n};\n\n// Set up mock database\ncommand.SetMockDatabase(mockDatabase);\n\n// Add template to in-memory storage\ncommand.InMemoryFiles[command.TemplateFileNameOrPath] = \"{{AppName}}\";\n\n// Execute\nvar result = command.TestOnExecute();\n```\n\n### Using with EF Core\n\nEzDbCodeGen now supports Entity Framework Core code generation with improved templates and handling of entity relationships. You can generate EF Core models and controllers with proper navigation properties and relationship handling.\n\nExample usage:\n\n```csharp\n// Create a configuration\nvar configuration = new Configuration();\nconfiguration.SetValue(\"Namespace\", \"MyApp\");\n\n// Set up entity security (optional)\nvar entitySecurity = new Dictionary\u003cstring, EntitySecurity\u003e\n{\n    { \"Customer\", new EntitySecurity { Secured = true } }\n};\nconfiguration.SetValue(\"EntitySecurity\", entitySecurity);\n\n// Create a code generator\nvar codeGenerator = new CodeGenerator(configuration);\n\n// Process templates\ncodeGenerator.ProcessModelTemplate(\"Templates/EFCoreModel.hbs\", templateDataInput, outputPath);\ncodeGenerator.ProcessControllerTemplate(\"Templates/EFCoreController.hbs\", templateDataInput, outputPath);\n```\n\n## Core Interfaces\n\nEzDbCodeGen is built around the core interfaces from [EzDbSchema](https://github.com/rvegajr/ez-db-schema-core). Here are the key interfaces you'll work with:\n\n```csharp\n// Root interface for database schema\npublic interface IDatabase\n{\n    string Name { get; }\n    string DefaultSchema { get; }\n    IEntityDictionary\u003cstring, IEntity\u003e Entities { get; }\n}\n\n// Represents a database table or view\npublic interface IEntity\n{\n    string TableName { get; }\n    string TableAlias { get; }\n    string DatabaseSchema { get; }\n    IPropertyDictionary\u003cstring, IProperty\u003e Properties { get; }\n    IRelationshipReferenceList Relationships { get; }\n}\n\n// Represents a database column\npublic interface IProperty\n{\n    string PropertyName { get; }\n    string ColumnName { get; }\n    string DataType { get; }\n    bool IsNullable { get; }\n    bool IsPrimaryKey { get; }\n    bool IsIdentity { get; }\n}\n\n// Represents table relationships\npublic interface IRelationship\n{\n    string ConstraintName { get; }\n    string FromTableName { get; }\n    string ToTableName { get; }\n    RelationshipMultiplicityType MultiplicityType { get; }\n    IEntity FromEntity { get; }\n    IEntity ToEntity { get; }\n}\n```\n\n### Using Interfaces in Templates\n\nYour Handlebars templates can access these interfaces directly. Here are some common patterns:\n\n```handlebars\n{{#each Entities}}\npublic class {{format \"pascalCase\" TableName}}\n{\n    {{#each Properties}}\n    {{#if IsPrimaryKey}}[Key]{{/if}}\n    {{#if IsRequired}}[Required]{{/if}}\n    public {{convertType DataType \"csharp\" IsNullable}} {{format \"pascalCase\" PropertyName}} { get; set; }\n    {{/each}}\n\n    {{#each Relationships}}\n    {{#if (eq MultiplicityType \"OneToMany\")}}\n    public virtual ICollection\u003c{{format \"pascalCase\" ToTableName}}\u003e {{format \"pascalCase\" ToTableName}} { get; set; }\n        = new List\u003c{{format \"pascalCase\" ToTableName}}\u003e();\n    {{else}}\n    public virtual {{format \"pascalCase\" ToTableName}} {{format \"pascalCase\" ToTableName}} { get; set; }\n    {{/if}}\n    {{/each}}\n}\n{{/each}}\n```\n\nFor more detailed examples and patterns, see [AI_USAGE.md](AI_USAGE.md).\n\n## Templating Capabilities\n\nEzDbCodeGen Core is a powerful code generation library that leverages Handlebars templates to generate code from database schemas.\n\n### Features\n\n- **Database Schema Support**: Works with EzDbSchema to read and analyze database structures\n- **Handlebars Templating**: Rich set of custom helpers for code generation\n- **Multi-Language Support**: Generate code for C#, TypeScript, Java, Python, and more\n- **Customizable Output**: Control formatting and layout of generated code\n\n### Templating Helpers\n\n#### FormatEz\nString formatting helper with multiple operations:\n```handlebars\n{{format \"camelCase,uppercase\" propertyName}}\n{{format \"snakeCase,tab1\" className}}\n```\n\nSupported operations:\n- Case transformations: camelCase, pascalCase, snakeCase, kebabCase, uppercase, lowercase\n- Indentation: indent2, indent4 (default), indent8\n- Tabbing: tab1, tab2, tab4\n\n#### ConvertTypeEz\nData type conversion helper:\n```handlebars\n{{convertType sqlType \"csharp\" nullable}}\n{{convertType \"varchar(50)\" \"typescript\"}}\n```\n\nSupported target languages:\n- C# (csharp)\n- TypeScript\n- JavaScript\n- Java\n- Python\n\n#### DocEz\nDocumentation generator for properties and relationships:\n```handlebars\n{{doc property \"xml\"}}\n{{doc relationship \"jsdoc\"}}\n```\n\nSupported formats:\n- XML (for C#)\n- JSDoc (for TypeScript/JavaScript)\n- JavaDoc (for Java)\n- Docstring (for Python)\n\n#### LayoutEz\nTemplate structure manager:\n```handlebars\n{{#layout}}\n  {{#region \"header\"}}\n    // Auto-generated code\n  {{/region}}\n  {{#region \"body\"}}\n    public class {{className}} {\n      {{\u003e properties}}\n    }\n  {{/region}}\n{{/layout}}\n```\n\n#### CodeFormatEz\nCode formatter for multiple languages:\n```handlebars\n{{formatCode \"csharp\" codeString}}\n{{formatCode \"sql\" queryString}}\n```\n\nSupported languages:\n- C#\n- SQL\n- TypeScript/JavaScript\n- HTML\n- CSS\n- Java\n- Python\n\n## AI Support\n\nThis project includes AI support files to help AI assistants understand and work with the codebase:\n\n- `AI_INDEX.md`: An index of the project structure and key components\n- `AI_USAGE.md`: Detailed examples and usage patterns for AI assistants\n\n## Deployment\n\nThis project was designed to be hosted and distributed with nuget.com.\n\n## Built With\n\n* [.NET 8.0](https://www.microsoft.com/net/learn/get-started) - The framework used\n* [Handlebars.Net](https://github.com/Handlebars-Net/Handlebars.Net) - Template engine\n* [EzDbSchema](https://github.com/rvegajr/ez-db-schema-core) - Database schema provider\n\n## Contributing\n\nPlease read [CONTRIBUTING.md](https://gist.github.com/rvegajr/651875c08acb76009e563db128f33e7e) for details on our code of conduct, and the process for submitting pull requests to us.\n\n## Versioning\n\nWe use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/rvegajr/tags). \n\n## Authors\n\n* **Ricky Vega** - *Initial work* - [Noctusoft](https://github.com/rvegajr)\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details\n\n## Acknowledgments\n\nMany thanks to the following projects that have helped in this project\n* EzDBSchema \n* McMaster.Extensions.CommandLineUtils\n* Handlebars.Net\n\n## HandleBar Custom Function Guide\n\nEzDbCodeGen provides a rich set of Handlebars helpers to make template creation easier and more powerful. This guide documents all available custom functions to help you create effective templates.\n\n### Basic Helpers\n\n| Helper | Description | Example |\n|--------|-------------|---------|\n| `{{Debugger}}` | Adds a debug point (useful for development) | `{{Debugger \"Checking value\"}}` |\n| `{{Comma}}` | Outputs a comma (useful in template loops) | `{{#each Properties}}{{Name}}{{#unless @last}}{{Comma}}{{/unless}}{{/each}}` |\n| `{{ToJson value}}` | Converts a value to JSON format | `{{ToJson Entity}}` |\n| `{{ContextAsJson}}` | Dumps the current context as JSON | `{{ContextAsJson true}}` (true for indented) |\n\n### Type Conversion Helpers\n\n| Helper | Description | Example |\n|--------|-------------|---------|\n| `{{ToNetType}}` | Converts database type to .NET type | `{{ToNetType DataType}}` |\n| `{{ToJsType}}` | Converts database type to JavaScript type | `{{ToJsType DataType}}` |\n| `{{AsNullableType type isNullable}}` | Adds nullable marker (?) if needed | `{{AsNullableType \"int\" IsNullable}}` |\n\n### String Formatting Helpers\n\n| Helper | Description | Example |\n|--------|-------------|---------|\n| `{{ToPascalCase}}` | Converts string to PascalCase | `{{ToPascalCase TableName}}` |\n| `{{ToCamelCase}}` | Converts string to camelCase | `{{ToCamelCase PropertyName}}` |\n| `{{ToSnakeCase}}` | Converts string to snake_case | `{{ToSnakeCase TableName}}` |\n| `{{ToSingular}}` | Converts plural to singular | `{{ToSingular TableName}}` |\n| `{{ToPlural}}` | Converts singular to plural | `{{ToPlural EntityName}}` |\n| `{{ToCodeFriendly}}` | Makes string code-friendly | `{{ToCodeFriendly RawName}}` |\n| `{{ExtractTableName}}` | Extracts table name from schema.table | `{{ExtractTableName \"dbo.Customer\"}}` |\n| `{{ExtractSchemaName}}` | Extracts schema name from schema.table | `{{ExtractSchemaName \"dbo.Customer\"}}` |\n| `{{AsFormattedName}}` | Formats name by removing common suffixes | `{{AsFormattedName TableName}}` |\n| `{{Prefix prefix value}}` | Adds prefix to string | `{{Prefix \"I\" EntityName}}` |\n| `{{StringFormat value format1 format2...}}` | Applies multiple string formats | `{{StringFormat TableName \"pascal\" \"singular\"}}` |\n\n### Conditional Helpers\n\n| Helper | Description | Example |\n|--------|-------------|---------|\n| `{{#IfPropertyExists propertyName}}` | Checks if property exists | `{{#IfPropertyExists \"IsNullable\"}}...{{else}}...{{/IfPropertyExists}}` |\n| `{{#IfFunctionExists functionName}}` | Checks if function exists | `{{#IfFunctionExists \"GetRelationships\"}}...{{/IfFunctionExists}}` |\n| `{{#IfCond left op right}}` | Conditional logic with operators | `{{#IfCond Value \"==\" \"string\"}}...{{else}}...{{/IfCond}}` |\n| `{{#Switch value}}{{#Case 'option'}}...{{/Case}}{{/Switch}}` | Switch/case logic | `{{#Switch DataType}}{{#Case \"int\"}}Integer{{/Case}}{{#Default}}String{{/Default}}{{/Switch}}` |\n\n### TypeScript Helpers\n\n| Helper | Description | Example |\n|--------|-------------|---------|\n| `{{tsType}}` | Converts to TypeScript type | `{{tsType DataType}}` |\n| `{{tsInterface}}` | Formats name as interface | `{{tsInterface TableName}}` |\n| `{{tsModel}}` | Formats name as model | `{{tsModel TableName}}` |\n| `{{tsService}}` | Formats name as service | `{{tsService TableName}}` |\n| `{{tsComponent}}` | Formats name as component | `{{tsComponent TableName}}` |\n| `{{tsModule}}` | Formats name as module | `{{tsModule TableName}}` |\n| `{{tsRouting}}` | Formats name as routing | `{{tsRouting TableName}}` |\n| `{{tsStore}}` | Formats name as store | `{{tsStore TableName}}` |\n\n### Foreign Key Helpers\n\n| Helper | Description | Example |\n|--------|-------------|---------|\n| `{{POCOModelFKProperties}}` | Generates POCO model foreign key properties | `{{POCOModelFKProperties \"    \"}}` |\n| `{{POCOModelFKManyToZeroToOne}}` | Generates POCO model many-to-zero-or-one relationships | `{{POCOModelFKManyToZeroToOne \"    \"}}` |\n| `{{GetForeignKeyProperties}}` | Gets foreign key properties for an entity | `{{#each (GetForeignKeyProperties Entity)}}...{{/each}}` |\n| `{{GetOneToOneReferences}}` | Gets one-to-one references | `{{#each (GetOneToOneReferences Entity)}}...{{/each}}` |\n| `{{GetForeignKeyCollectionsForEntity}}` | Gets foreign key collections | `{{#each (GetForeignKeyCollectionsForEntity Entity)}}...{{/each}}` |\n\n### Template Examples\n\n#### Entity Framework Core Model\n\n```handlebars\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\n\nnamespace {{Namespace}}.Models\n{\n    [Table(\"{{ExtractTableName TableName}}\", Schema = \"{{ExtractSchemaName TableName}}\")]\n    public partial class {{ToPascalCase (ToSingular (ExtractTableName TableName))}}\n    {\n        public {{ToPascalCase (ToSingular (ExtractTableName TableName))}}()\n        {\n            {{#each (GetForeignKeyCollectionsForEntity this)}}\n            {{NavigationProperty}} = new HashSet\u003c{{RelatedEntity}}\u003e();\n            {{/each}}\n        }\n\n        {{#each Properties}}\n        {{#if IsPrimaryKey}}\n        [Key]\n        {{/if}}\n        {{#if IsIdentity}}\n        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]\n        {{/if}}\n        {{#if MaxLength}}\n        [StringLength({{MaxLength}})]\n        {{/if}}\n        {{#if IsRequired}}\n        [Required]\n        {{/if}}\n        [Column(\"{{Name}}\")]\n        public {{AsNullableType (ToNetType DataType) IsNullable}} {{ToPascalCase Name}} { get; set; }\n        {{/each}}\n\n        {{POCOModelFKProperties \"        \"}}\n\n        {{#each (GetForeignKeyCollectionsForEntity this)}}\n        public virtual ICollection\u003c{{RelatedEntity}}\u003e {{NavigationProperty}} { get; set; }\n        {{/each}}\n    }\n}\n```\n\n#### TypeScript Interface\n\n```handlebars\nexport interface {{tsInterface TableName}} {\n    {{#each Properties}}\n    {{ToCamelCase Name}}: {{tsType DataType}}{{#if IsNullable}} | null{{/if}};\n    {{/each}}\n    \n    {{#each (GetOneToOneReferences this)}}\n    {{ToCamelCase NavigationProperty}}?: {{tsInterface RelatedEntity}};\n    {{/each}}\n    \n    {{#each (GetForeignKeyCollectionsForEntity this)}}\n    {{ToCamelCase NavigationProperty}}?: {{tsInterface RelatedEntity}}[];\n    {{/each}}\n}\n```\n\nFor more detailed examples and usage patterns, refer to the [AI_USAGE.md](AI_USAGE.md) file.\n\n## Recent Changes\n\n### 8.5.0 (March 2025)\n- Major refactoring with improved code organization\n- Enhanced dotnet tool installation and usage experience\n- Consolidated projects into fewer, more focused components\n- Fixed all test issues, particularly in TestableCodeGenerator class\n- Added proper Handlebars helpers for security and debugging\n- Implemented null-safe handling throughout the codebase\n- Added new templates in a dedicated Templates directory\n- Improved documentation for dotnet tool usage\n\n### 8.4.2 (March 2025)\n- Fixed EF Core code generation tests and implementation\n- Added entity name normalization for consistent casing\n- Improved entity security handling\n- Added comprehensive debug logging\n- Enhanced template processing with Handlebars\n- Added AI support files for better integration with AI assistants\n- Updated documentation with EF Core examples\n\n### 8.4.1 (February 2025)\n- Added support for .NET 8.0\n- Fixed issues with ambiguous references between Newtonsoft.Json and System.Text.Json\n- Addressed namespace issues with EzDbSchema.Core.Extensions vs EzDbSchema.Core.Extentions\n- Fixed null reference warnings due to nullable reference types being enabled\n- Improved handling of property access in KeyValuePair\u003cstring, IProperty\u003e\n\n### 8.4.0 (January 2025)\n- Updated to .NET 8.0\n- Added configuration string fixes\n- Updated package dependencies:\n  - EzDbSchema to 8.4.1\n  - EzDbSchema.MsSql to 8.4.0\n  - Handlebars.Net to 2.1.4\n  - Newtonsoft.Json to 13.0.3","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frvegajr%2Fez-db-codegen-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frvegajr%2Fez-db-codegen-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frvegajr%2Fez-db-codegen-core/lists"}