{"id":23334062,"url":"https://github.com/simplesoft-pt/database","last_synced_at":"2025-04-09T18:50:53.961Z","repository":{"id":45437476,"uuid":"342571696","full_name":"simplesoft-pt/Database","owner":"simplesoft-pt","description":"Library with helper interfaces and classes for database access.","archived":false,"fork":false,"pushed_at":"2023-09-29T13:22:32.000Z","size":111,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-23T20:51:12.597Z","etag":null,"topics":[],"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/simplesoft-pt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-02-26T12:38:44.000Z","updated_at":"2023-02-23T17:37:45.000Z","dependencies_parsed_at":"2022-08-31T08:51:26.903Z","dependency_job_id":null,"html_url":"https://github.com/simplesoft-pt/Database","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simplesoft-pt%2FDatabase","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simplesoft-pt%2FDatabase/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simplesoft-pt%2FDatabase/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simplesoft-pt%2FDatabase/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/simplesoft-pt","download_url":"https://codeload.github.com/simplesoft-pt/Database/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248092260,"owners_count":21046446,"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":[],"created_at":"2024-12-21T00:37:34.289Z","updated_at":"2025-04-09T18:50:53.931Z","avatar_url":"https://github.com/simplesoft-pt.png","language":"C#","readme":"# Database\nSmall .NET library that helps to decouple database and business layers by exposing a wide range of interfaces that can be implemented using your favorite ORM, micro-ORM, ADO.NET or even all since everything is plugable and implementation can be swapped per entity.\n\n## Installation\nThe library is available via [NuGet](https://www.nuget.org/packages?q=simplesoft.database) packages:\n\n| NuGet | Description | Version |\n| --- | --- | --- |\n| [SimpleSoft.Database.Contracts](https://www.nuget.org/packages/simplesoft.database.contracts) | database contracts (IReadById, ICreate, IDelete, ...) | [![NuGet](https://img.shields.io/nuget/vpre/simplesoft.database.contracts.svg)](https://www.nuget.org/packages/simplesoft.database.contracts) |\n| [SimpleSoft.Database.EFCore](https://www.nuget.org/packages/simplesoft.database.efcore) | Entity Framework Core implementation | [![NuGet](https://img.shields.io/nuget/vpre/simplesoft.database.efcore.svg)](https://www.nuget.org/packages/simplesoft.database.efcore) |\n| [SimpleSoft.Database.NH](https://www.nuget.org/packages/simplesoft.database.nh) | NHibernate implementation | [![NuGet](https://img.shields.io/nuget/vpre/simplesoft.database.nh.svg)](https://www.nuget.org/packages/simplesoft.database.nh) |\n\n## Compatibility\nThis library is compatible with the following frameworks:\n\n* `SimpleSoft.Database.Contracts`\n  * .NET Framework 4.0+;\n  * .NET Standard 1.0+;\n* `SimpleSoft.Database.EFCore`\n  * .NET Standard 1.3+;\n* `SimpleSoft.Database.NH`\n  * .NET Framework 4.6.1+;\n  * .NET Standard 2.0+;\n  * .NET Core App 2.0+;\n\n## Usage\nHere is a simple example how to setup and use within an ASP.NET Core application:\n\n```csharp\npublic class Startup\n{\n    public void ConfigureServices(IServiceCollection services)\n    {\n        services\n            .AddDbContext\u003cExampleContext\u003e(o =\u003e o.UseInMemoryDatabase(\"ExampleDatabase\"))\n            .AddDbContextOperations\u003cExampleContext\u003e(); // this line here\n\n        services.AddMvc();\n    }\n    \n    // ...\n}\n\npublic class ExampleContext : DbContext\n{\n    public ExampleContext(DbContextOptions\u003cExampleContext\u003e options) : base(options) { }\n\n    protected override void OnModelCreating(ModelBuilder builder)\n    {\n        builder.Entity\u003cProductEntity\u003e(cfg =\u003e\n        {\n            cfg.MapPrimaryKey();\n            cfg.MapExternalId();\n            cfg.HasIndex(e =\u003e e.Code).IsUnique();\n\n            cfg.Property(e =\u003e e.Code)\n                .IsRequired()\n                .HasMaxLength(8);\n            cfg.Property(e =\u003e e.Name)\n                .IsRequired()\n                .HasMaxLength(256);\n            cfg.Property(e =\u003e e.Price)\n                .IsRequired();\n        });\n    }\n}\n\n[Route(\"products\")]\npublic class ProductsController : Controller\n{\n    // either inject by constructor\n    \n    //private readonly IQueryable\u003cProductEntity\u003e _productQuery;\n    //private readonly IReadByExternalId\u003cProductEntity\u003e _productByExternalId;\n    //private readonly ICreate\u003cProductEntity\u003e _productCreate;\n    \n    //public ProductsController(\n    //    IQueryable\u003cProductEntity\u003e productQuery,\n    //    IReadByExternalId\u003cProductEntity\u003e productByExternalId,\n    //    ICreate\u003cProductEntity\u003e productCreate\n    //)\n    //{\n    //    _productQuery = productQuery;\n    //    _productByExternalId = productByExternalId;\n    //    _productCreate = productCreate;\n    //}\n    \n    // or inject directly into each method\n    [HttpGet(\"\")]\n    public async Task\u003cIEnumerable\u003cProductModel\u003e\u003e GetAll(\n        [FromServices] IQueryable\u003cProductEntity\u003e productQuery,\n        CancellationToken ct\n    )\n    {\n        return await productQuery.Select(p =\u003e new ProductModel\n        {\n            Id = p.ExternalId,\n            Code = p.Code,\n            Name = p.Name,\n            Price = p.Price\n        }).ToListAsync(ct);\n    }\n\n    [HttpGet(\"{id:guid}\")]\n    public async Task\u003cIActionResult\u003e GetById(\n        [FromServices] IReadByExternalId\u003cProductEntity\u003e productByExternalId,\n        [FromRoute] Guid id,\n        CancellationToken ct\n    )\n    {\n        var product = await productByExternalId.ReadAsync(id, ct);\n        if (product == null)\n        {\n            return NotFound(new ErrorModel\n            {\n                Message = $\"Product {id} not found\"\n            });\n        }\n\n        return Ok(new ProductModel\n        {\n            Id = product.ExternalId,\n            Code = product.Code,\n            Name = product.Name,\n            Price = product.Price\n        });\n    }\n\n    [HttpPost]\n    public async Task\u003cIActionResult\u003e Create(\n        [FromServices] IQueryable\u003cProductEntity\u003e productQuery,\n        [FromServices] ICreate\u003cProductEntity\u003e productCreate,\n        [FromBody] CreateProductModel model,\n        CancellationToken ct\n    )\n    {\n        if (await productQuery.AnyAsync(p =\u003e p.Code == model.Code, ct))\n        {\n            return Conflict(new ErrorModel\n            {\n                Message = \"Duplicated product code\"\n            });\n        }\n\n        var product = await productCreate.CreateAsync(new ProductEntity\n        {\n            ExternalId = Guid.NewGuid(),\n            Code = model.Code,\n            Name = model.Name,\n            Price = model.Price\n        }, ct);\n\n        return CreatedAtAction(nameof(GetById), new {id = product.ExternalId}, new ProductModel\n        {\n            Id = product.ExternalId,\n            Code = product.Code,\n            Name = product.Name,\n            Price = product.Price\n        });\n    }\n}\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimplesoft-pt%2Fdatabase","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsimplesoft-pt%2Fdatabase","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimplesoft-pt%2Fdatabase/lists"}