{"id":47249795,"url":"https://github.com/mjczone/dappermatic","last_synced_at":"2026-06-22T07:31:28.548Z","repository":{"id":324287925,"uuid":"1060141219","full_name":"mjczone/dappermatic","owner":"mjczone","description":"IDbConnection extension methods for DDL (Data Definition Language) operations.","archived":false,"fork":false,"pushed_at":"2026-03-25T19:35:23.000Z","size":1516,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-26T17:44:07.297Z","etag":null,"topics":["api","aspnetcore","csharp","dapper","ddl","dml","dotnet","mysql","orm","postgresql","sqlite","sqlserver"],"latest_commit_sha":null,"homepage":"https://dappermatic.mjczone.com","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mjczone.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-19T12:53:28.000Z","updated_at":"2026-03-25T19:35:28.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mjczone/dappermatic","commit_stats":null,"previous_names":["mjczone/dappermatic","mjczone/mjczone.dappermatic"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/mjczone/dappermatic","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjczone%2Fdappermatic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjczone%2Fdappermatic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjczone%2Fdappermatic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjczone%2Fdappermatic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mjczone","download_url":"https://codeload.github.com/mjczone/dappermatic/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjczone%2Fdappermatic/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34639704,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["api","aspnetcore","csharp","dapper","ddl","dml","dotnet","mysql","orm","postgresql","sqlite","sqlserver"],"created_at":"2026-03-14T12:19:04.656Z","updated_at":"2026-06-22T07:31:28.542Z","avatar_url":"https://github.com/mjczone.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DapperMatic\n\n\u003e ⚠️ **UNDER DEVELOPMENT - BREAKING CHANGES EXPECTED**\n\u003e\n\u003e This library is in active development (v0.x.x). The API is not yet stable and breaking changes may occur between releases. Do not use in production until v1.0.0 is released.\n\n**Model-first database schema management and query compatibility for .NET applications**\n\nDapperMatic extends `IDbConnection` with extension methods for **DDL operations** (create/modify/inspect schemas) and **DML query compatibility** (enhanced Dapper queries with attribute-based column mapping) across SQL Server, MySQL/MariaDB, PostgreSQL, and SQLite.\n\n[![.github/workflows/build-and-test.yml](https://github.com/mjczone/dappermatic/actions/workflows/build-and-test.yml/badge.svg)](https://github.com/mjczone/dappermatic/actions/workflows/build-and-test.yml)\n[![.github/workflows/release.yml](https://github.com/mjczone/dappermatic/actions/workflows/release.yml/badge.svg)](https://github.com/mjczone/dappermatic/actions/workflows/release.yml)\n[![NuGet](https://img.shields.io/nuget/v/MJCZone.DapperMatic.svg?label=NuGet)](https://www.nuget.org/packages/MJCZone.DapperMatic/)\n[![.NET](https://img.shields.io/badge/.NET-8.0+-purple.svg)](https://dotnet.microsoft.com/download)\n[![License: LGPL v3](https://img.shields.io/badge/License-LGPL_v3-blue.svg)](LICENSE)\n\n📚 **[Full Documentation](https://dappermatic.mjczone.com/)**\n\n🤖 **For AI Assistants:** [llms.txt](https://dappermatic.mjczone.com/llms.txt) | [llms-full.txt](https://dappermatic.mjczone.com/llms-full.txt)\n\n---\n\n## Why DapperMatic?\n\nDapperMatic offers an **alternative approach** to database schema management and query mapping for .NET applications. \n\nHow DapperMatic might fit your needs:\n\n- **Lightweight \u0026 Flexible**: You want a lightweight library that extends Dapper without the overhead of a full ORM\n- **Extremely Fast to get started**: You want to define your database schema using C# models with attributes and create/modify schemas with an intuitive API\n- **Runtime Schema Management**: You need to create or modify database schemas at runtime (multi-tenant apps, dynamic schema generation, deployment-time setup)\n- **Dapper + Attributes**: You prefer Dapper for queries but want attribute-based column mapping without writing repetitive property-to-column code\n- **Cross-Provider Portability**: You need the same models and code to work across SQL Server, PostgreSQL, MySQL, and SQLite with provider-specific SQL generation\n\n**Existing Tools**:\n- **Entity Framework Core**: Full-featured ORM with change tracking, LINQ queries, and comprehensive migration tooling - could be your better choice for complex LINQ scenarios\n- **FluentMigrator**: Version-controlled, code-based migrations with rollback support - better choice for team-based migration workflows\n\nDapperMatic can coexist in the same application as your other data access tools.\nThe only DapperMatic dependency in the core library is Dapper.\n\n---\n\n## Installation\n\n### Core Library\n```bash\ndotnet add package MJCZone.DapperMatic\n```\n\n### ASP.NET Core Integration\n```bash\ndotnet add package MJCZone.DapperMatic.AspNetCore\n```\n\n### Prerequisites\n\n- **.NET 8.0** or later\n\n---\n\n## Supported Database Providers\n\n| Provider | Versions Tested | Connection Types |\n|----------|----------|------------------|\n| **SQL Server** | 2017, 2019, 2022 | `Microsoft.Data.SqlClient`, `System.Data.SqlClient` |\n| **PostgreSQL** | 15, 16, 17 | `Npgsql` |\n| **MySQL** | 5.7, 8.4, 9.0+ | `MySqlConnector`, `MySQL.Data` |\n| **MariaDB** | 10.11, 11.4, 11.8, 12.0 | `MySqlConnector`, `MySQL.Data` |\n| **SQLite** | 3.x | `Microsoft.Data.Sqlite`, `System.Data.SQLite` |\n\n---\n\n## Quick Start\n\n### 1. Define Your Models with Attributes\n\n```csharp\nusing MJCZone.DapperMatic.DataAnnotations;\nusing System.Text.Json;\n\n[DmTable(\"products\")]\n[DmIndex(false, new[] { \"product_name\" }, \"IX_Product_Name\")] // Non-unique index on product name\npublic class Product\n{\n    [DmColumn(\"product_id\", isPrimaryKey: true, isAutoIncrement: true)]\n    public int Id { get; set; }\n\n    [DmColumn(\"product_name\", length: 200, isNullable: false)]\n    public string Name { get; set; } = string.Empty;\n\n    [DmColumn(\"price\", precision: 18, scale: 2, isNullable: false)]\n    public decimal Price { get; set; }\n\n    [DmColumn(\"category\", isNullable: false)]\n    public DayOfWeek Category { get; set; } // Enum stored as string\n\n    [DmColumn(\"tags\", isNullable: true)]\n    public string[]? Tags { get; set; } // Smart array handling (native on PostgreSQL, JSON elsewhere)\n\n    [DmColumn(\"metadata\", isNullable: true)]\n    public JsonDocument? Metadata { get; set; } // JSON storage\n\n    [DmColumn(\"attributes\", isNullable: true)]\n    public Dictionary\u003cstring, object\u003e? Attributes { get; set; } // Dictionary stored as JSON\n\n    [DmColumn(\"created_at\", isNullable: false)]\n    public DateTime CreatedAt { get; set; }\n\n    [DmColumn(\"shipping_time\", isNullable: true)]\n    public TimeSpan? ShippingTime { get; set; }\n\n    // Navigation property - not mapped to database\n    [DmIgnore]\n    public List\u003cProductDetails\u003e? Details { get; set; }\n}\n\n[DmTable(\"ProductDetails\")]\npublic class ProductDetails\n{\n    [DmColumn(\"detail_id\", isPrimaryKey: true, isAutoIncrement: true)]\n    public int Id { get; set; }\n\n    [DmColumn(\"product_id\", isNullable: false)]\n    [DmForeignKeyConstraint(\n        referencedType: typeof(Product),\n        referencedColumnNames: new[] { \"product_id\" }\n    )] // Can be applied to Class as well\n    public int ProductId { get; set; }\n\n    [DmColumn(\"description\", isNullable: false)]\n    public string Description { get; set; } = string.Empty;\n\n    [DmColumn(\"specs\", isNullable: true)]\n    public Dictionary\u003cstring, object\u003e? Specifications { get; set; }\n}\n```\n\n### 2. Create Tables from Models (DDL)\n\nThere are hundreds of extension methods available for schema management, using typed, untyped, and expression-based APIs.\n\nHere are a few examples to get you started:\n\n```csharp\nusing MJCZone.DapperMatic;\nusing Microsoft.Data.SqlClient;\n\n// Connect to your database\nusing var connection = new SqlConnection(\"your-connection-string\");\nawait connection.OpenAsync();\n\n// Create a schema\nawait connection.CreateSchemaIfNotExistsAsync(\"public\");\n\n// Create tables from your models (automatically handles relationships, without\n// needing to worry about the order of type creation)\nawait connection.CreateTablesIfNotExistsAsync([typeof(Product), typeof(ProductDetails)]);\n// Or individually\nawait connection.CreateTableIfNotExistsAsync\u003cProduct\u003e();\nawait connection.CreateTableIfNotExistsAsync(typeof(ProductDetails));\n\n// Untyped version\nawait connection.CreateTableIfNotExistsAsync(\n    /*schemaName or null for default*/ \"public\", \n    /*tableName*/ \"products\", \n    /*columns*/ new[]\n    {\n        new DmColumn(\"product_id\", typeof(int), isPrimaryKey: true, isAutoIncrement: true),\n        new DmColumn(\"product_name\", typeof(string), length: 200, isNullable: false),\n        new DmColumn(\"price\", typeof(decimal), precision: 18, scale: 2, isNullable: false),\n        // Additional columns...\n    },\n    /* Optional indexes, constraints, etc. */\n    // , primaryKey:  new DmPrimaryKeyConstraint(...) { ...},\n    // , checkConstraints:  [ new DmCheckConstraint(...) { ... }, ... ],\n    // , defaultConstraints:  [ new DmDefaultConstraint(...) { ... }, ... ],\n    // , uniqueConstraints:  [ new DmUniqueConstraint(...) { ... }, ... ],\n    // , foreignKeyConstraints:  [ new DmForeignKeyConstraint(...) { ... }, ... ]\n    // , indexes:  [ new DmIndex(...) { ... }, ... ]\n);\n\n// Verify tables exist\nbool productTableExists = await connection.DoesTableExistAsync\u003cProduct\u003e();\nbool detailsTableExists = await connection.DoesTableExistAsync\u003cProductDetails\u003e();\n\n// Add a missing column\nawait connection.CreateColumnIfNotExistsAsync\u003cProduct\u003e(\n    new DmColumn(\"last_updated\", typeof(DateTime), isNullable: true, /* additional optional arguments */)\n);\n// Or using expressions\nawait connection.CreateColumnIfNotExistsAsync\u003cProduct\u003e(\n    p =\u003e p.LastUpdated, \n    // Optional additional configuration\n    col =\u003e \n    {\n        col.IsNullable = true;\n    }\n);\n// Or untyped version\nawait connection.CreateColumnIfNotExistsAsync(\n    /*schemaName or null for default*/ \"public\", \n    /*tableName*/ \"products\", \n    /*columnName*/ \"discount\",\n    /*dotnetType*/ typeof(decimal),\n    configureColumn: col =\u003e\n    {\n        /* Optional customizations */\n        col.IsNullable = true;\n        col.Precision = 5;\n        col.Scale = 2;\n\n        /* Additional provider-specific data types */\n        col.ProviderDataTypes[DbProviderType.SqlServer] = \"DECIMAL(5, 2)\";\n        col.ProviderDataTypes[DbProviderType.PostgreSql] = \"NUMERIC(5, 2)\";\n\n        // Or use a custom types (e.g. with PostGIS extension)\n        // See DML documentation for spatial type support\n        //column.ProviderDataTypes[DbProviderType.PostgreSql] = \"geometry(Point)\";\n    }\n);\n\n// Drop a column\nawait connection.DropColumnAsync\u003cProduct\u003e(\"discount\");\n```\n\n### 3. Use with Dapper Queries (DML)\n\n```csharp\nusing MJCZone.DapperMatic.TypeMapping;\nusing Dapper;\nusing System.Text.Json;\n\n// Initialize type mappings once at application startup\nDapperMaticTypeMapping.Initialize();\n\n// Insert with Dapper (column names are automatically mapped via DmColumn attributes)\nvar product = new Product\n{\n    Name = \"Laptop\",\n    Price = 999.99m,\n    Category = DayOfWeek.Monday,\n    Tags = new[] { \"electronics\", \"computers\" },\n    Metadata = JsonDocument.Parse(@\"{\"\"brand\"\": \"\"TechCorp\"\"}\"),\n    Attributes = new Dictionary\u003cstring, object\u003e\n    {\n        [\"warranty\"] = \"2 years\",\n        [\"inStock\"] = true,\n    },\n    CreatedAt = DateTime.UtcNow,\n    ShippingTime = TimeSpan.FromDays(3),\n};\n\nawait connection.ExecuteAsync(\n    @\"INSERT INTO products (product_name, price, category, tags, metadata, attributes, created_at, shipping_time)\n      VALUES (@Name, @Price, @Category, @Tags, @Metadata, @Attributes, @CreatedAt, @ShippingTime)\",\n    product\n);\n\n// Query with Dapper (DmColumn attributes automatically map database columns to properties)\nvar products = await connection.QueryAsync\u003cProduct\u003e(\n    @\"SELECT product_id, product_name, price, category, tags, metadata, attributes, created_at, shipping_time\n      FROM products\n      WHERE price \u003e @MinPrice\",\n    new { MinPrice = 500m }\n);\n\nforeach (var p in products)\n{\n    Console.WriteLine($\"{p.Name}: ${p.Price}\");\n    Console.WriteLine($\"  Tags: {string.Join(\", \", p.Tags ?? Array.Empty\u003cstring\u003e())}\");\n}\n```\n\n### 4. Cross-Provider Support (Same Code, Any Database)\n\n```csharp\nusing Microsoft.Data.SqlClient;\nusing Npgsql;\nusing MySqlConnector;\nusing Microsoft.Data.Sqlite;\n\n// Same API works across all supported databases\nusing var sqlServer = new SqlConnection(sqlServerConnectionString);\nusing var postgres = new NpgsqlConnection(postgresConnectionString);\nusing var mysql = new MySqlConnection(mysqlConnectionString);\nusing var sqlite = new SqliteConnection(sqliteConnectionString);\n\n// Identical DDL operations across providers\nawait sqlServer.CreateTableIfNotExistsAsync\u003cProduct\u003e();\nawait postgres.CreateTableIfNotExistsAsync\u003cProduct\u003e();  // Arrays stored as native PostgreSQL arrays\nawait mysql.CreateTableIfNotExistsAsync\u003cProduct\u003e();     // Arrays stored as JSON\nawait sqlite.CreateTableIfNotExistsAsync\u003cProduct\u003e();    // Arrays stored as JSON\n```\n\n---\n\n## Key Capabilities at a Glance\n\n| DDL Operations | DML Operations | ASP.NET Core Integration |\n|----------------|----------------|--------------------------|\n| Create/Drop Tables | Smart Type Handlers | REST API Endpoints |\n| Indexes \u0026 Constraints | Dapper Integration | Multi-Datasource Management |\n| Schema Inspection | Array/JSON/XML Support | Authorization Hooks |\n| Foreign Keys | Attribute-Based Mapping | Audit Logging |\n| Type Mapping | Modern C# (Records) | Encrypted Connection Strings |\n\n### DDL Operations - Complete Schema Management\n\n```csharp\n// Inspect existing schemas\nvar tableNames = await connection.GetTableNamesAsync(\"dbo\");\nvar table = await connection.GetTableAsync(\"dbo\", \"products\");\nvar columns = await connection.GetColumnsAsync(\"dbo\", \"products\");\nvar indexes = await connection.GetIndexesAsync(\"dbo\", \"products\");\nvar foreignKeys = await connection.GetForeignKeyConstraintsAsync(\"dbo\", \"products\");\n\n// Modify schemas\nawait connection.AddColumnAsync(\"dbo\", \"products\", new DmColumn(\"discount\", typeof(decimal)));\nawait connection.DropColumnAsync(\"dbo\", \"products\", \"discount\");\n\n// Drop tables\nawait connection.DropTableIfExistsAsync(\"dbo\", \"products\");\n```\n\n### DML Operations - Advanced Type Support\n\nDapperMatic provides smart type handlers for seamless Dapper query compatibility:\n\n**Basic Types**: `int`, `long`, `string`, `decimal`, `DateTime`, `DateTimeOffset`, `TimeSpan`, `Guid`, `byte[]`\n\n**Advanced Types**:\n- **XML**: `XDocument` - Serialized across all providers\n- **JSON**: `JsonDocument` - Native JSON on supported providers\n- **Collections**: `Dictionary\u003cTKey, TValue\u003e`, `List\u003cT\u003e` - JSON serialization\n- **Arrays**: `string[]`, `int[]`, `DateTime[]`, etc. - Native PostgreSQL arrays, JSON fallback\n- **Network**: `IPAddress`, `PhysicalAddress`, `NpgsqlCidr` - PostgreSQL native, string elsewhere\n- **Spatial**: NetTopologySuite types, PostgreSQL geometric types, MySQL geometry\n- **Enums**: String-based storage with custom handlers\n\n**Example with complex types**:\n```csharp\n[DmTable(\"articles\")]\npublic class Article\n{\n    [DmColumn(\"article_id\", isPrimaryKey: true, isAutoIncrement: true)]\n    public int Id { get; set; }\n    [DmColumn(\"content\", isNullable: false)]\n    public XDocument Content { get; set; } = null!;      // XML storage\n    [DmColumn(\"settings\", isNullable: false)]\n    public JsonDocument Settings { get; set; } = null!;   // JSON storage\n    [DmColumn(\"authors\", isNullable: false)]\n    public string[] Authors { get; set; } = null!;        // Array (native PG, JSON elsewhere)\n    [DmColumn(\"source_ip\", isNullable: true)]\n    public IPAddress? SourceIp { get; set; }              // Network type\n}\n\n// After DapperMaticTypeMapping.Initialize(/* configureOptions */), Dapper queries just work\nvar articles = await connection.QueryAsync\u003cArticle\u003e(\"SELECT * FROM articles\");\n```\n\n---\n\n## ASP.NET Core Integration\n\n### Basic Setup\n\n```csharp\nusing MJCZone.DapperMatic.AspNetCore;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n// Register DapperMatic services with default in-memory datasource repositories\nbuilder.Services.AddDapperMatic();\n\nvar app = builder.Build();\n\n// Map DapperMatic API endpoints\napp.UseDapperMatic();\n\napp.Run();\n```\n\nThis creates REST endpoints for managing database connections (datasources):\n- `POST /api/dappermatic/datasources/list` - List all datasources\n- `POST /api/dappermatic/datasources/get` - Get datasource by name\n- `POST /api/dappermatic/datasources/add` - Add new datasource\n- `POST /api/dappermatic/datasources/update` - Update existing datasource\n- `POST /api/dappermatic/datasources/remove` - Remove datasource\n\n### Custom Permission Handling\n\n```csharp\nusing MJCZone.DapperMatic.AspNetCore.Interfaces;\n\n// Implement custom permissions (e.g., check user roles from database)\npublic class CustomPermissions : IDapperMaticPermissions\n{\n    public CustomPermissions(/* Inject your dependencies here */)\n    {\n        // ...\n    }\n\n    public async Task\u003cbool\u003e IsAuthorizedAsync(IOperationContext context)\n    {\n        // Example: Check if user is authenticated\n        if(context.User?.Identity?.IsAuthenticated != true)\n            return false;\n\n        //\n        // Add additional checks as needed\n        // \n        // The context has information about the current datasource,\n        // operation, user, and access to critical request information.\n        //\n\n        return true;\n    }\n}\n\n// Configure DapperMatic options from the appsettings.json file\nbuilder.Services.Configure\u003cDapperMaticOptions\u003e(builder.Configuration.GetSection(\"DapperMatic\"));\n\n// Override the datasource repository\nbuilder.Services.AddSingleton\u003cIDapperMaticDatasourceRepository, CustomDatasourceRepository\u003e();\n\n// Register in DI\nbuilder.Services.AddSingleton\u003cIDapperMaticPermissions, CustomPermissions\u003e();\nbuilder.Services.AddDapperMatic();\n\n// Or use the builder\nbuilder.Services.AddDapperMatic(options =\u003e\n{\n    // Optionally use static datasource definitions\n    options.WithDatasources( ... );\n\n    // Optionally customize a datasource ID factory\n    options.UseCustomDatasourceIdFactory( ... );\n\n    // Optional use a custom permissions implementation (by default is registered as Singleton)\n    options.UseCustomPermissions\u003cCustomPermissions\u003e();\n\n    // Optionally override the audity logger\n    options.UseCustomAuditLogger\u003cCustomAuditLogger\u003e();\n\n    // Optionally override the datasource repository\n    options.UseCustomDatasourceRepository\u003cCustomDatasourceRepository\u003e();\n\n    // Or use an existing datasource repository instance\n    // ConnectionStrings are stored encrypted\n    options.UseFileDatasourceRepository(\"path/to/datasources.json\");\n    options.UseDatabaseDatasourceRepository(\"postgresql\" /*mysql,sqlite,sqlserver*/, \"Host=...;Database=...;Username=...;Password=...;\");\n})\n```\n\n---\n\n## Documentation \u0026 Resources\n\n- 📚 **[Full Documentation](https://dappermatic.mjczone.com/)** - Comprehensive guides and API reference\n- 📖 **[DML Query Support Guide](https://dappermatic.mjczone.com/guide/dml-query-support.html)** - Complete guide to Dapper integration\n- 🗄️ **[Database Providers](https://dappermatic.mjczone.com/guide/providers.html)** - Supported databases and type mappings\n- 💡 **[Getting Started](https://dappermatic.mjczone.com/guide/getting-started.html)** - Step-by-step tutorial\n- 🧪 **[Test Examples](tests/)** - Extensive usage examples in the test suite\n\n---\n\n## License\n\nThis project is licensed under the GNU Lesser General Public License v3.0 or later (LGPL-3.0-or-later) - see the [LICENSE](LICENSE) file for details.\n\n**What this means:**\n- ✅ You can use DapperMatic in commercial applications\n- ✅ You can modify and distribute DapperMatic\n- ✅ Your application code remains under your chosen license\n- ⚠️ Changes to DapperMatic itself must be contributed back under LGPL\n\n---\n\n## Support\n\n- 🐛 **Bug Reports** - [GitHub Issues](https://github.com/mjczone/dappermatic/issues)\n- 💬 **Discussions** - [GitHub Discussions](https://github.com/mjczone/dappermatic/discussions)\n- 💻 **Contributing** - See [CONTRIBUTING.md](CONTRIBUTING.md) for current contribution guidelines\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Built with ❤️ by MJCZone Inc.**\n\n[Website](https://mjczone.com) • [GitHub](https://github.com/mjczone) • [NuGet](https://www.nuget.org/profiles/mjczone)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmjczone%2Fdappermatic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmjczone%2Fdappermatic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmjczone%2Fdappermatic/lists"}