{"id":20280895,"url":"https://github.com/daniel127/ef-unit-of-work","last_synced_at":"2025-04-11T06:37:42.093Z","repository":{"id":51330688,"uuid":"251075963","full_name":"Daniel127/EF-Unit-Of-Work","owner":"Daniel127","description":"Repository and Unit of Work pattern implementation for Entity Framework Core.","archived":false,"fork":false,"pushed_at":"2021-05-14T19:55:12.000Z","size":144,"stargazers_count":14,"open_issues_count":0,"forks_count":7,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-03-25T04:32:56.397Z","etag":null,"topics":["core","entity","entity-framework","framework","net","of","repository","unit","unit-of-work","unitofwork","unitofwork-pattern","work"],"latest_commit_sha":null,"homepage":"","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/Daniel127.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-03-29T16:16:47.000Z","updated_at":"2024-04-25T01:14:26.000Z","dependencies_parsed_at":"2022-08-26T10:10:53.325Z","dependency_job_id":null,"html_url":"https://github.com/Daniel127/EF-Unit-Of-Work","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel127%2FEF-Unit-Of-Work","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel127%2FEF-Unit-Of-Work/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel127%2FEF-Unit-Of-Work/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel127%2FEF-Unit-Of-Work/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Daniel127","download_url":"https://codeload.github.com/Daniel127/EF-Unit-Of-Work/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248358547,"owners_count":21090401,"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":["core","entity","entity-framework","framework","net","of","repository","unit","unit-of-work","unitofwork","unitofwork-pattern","work"],"created_at":"2024-11-14T13:38:14.492Z","updated_at":"2025-04-11T06:37:42.068Z","avatar_url":"https://github.com/Daniel127.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Status\n[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=ef-unit-of-work\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=ef-unit-of-work) [![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=ef-unit-of-work\u0026metric=ncloc)](https://sonarcloud.io/dashboard?id=ef-unit-of-work) [![Bugs](https://sonarcloud.io/api/project_badges/measure?project=ef-unit-of-work\u0026metric=bugs)](https://sonarcloud.io/dashboard?id=ef-unit-of-work) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=ef-unit-of-work\u0026metric=coverage)](https://sonarcloud.io/dashboard?id=ef-unit-of-work) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=ef-unit-of-work\u0026metric=sqale_rating)](https://sonarcloud.io/dashboard?id=ef-unit-of-work)\n\n[GitHubBadgeMaster]: https://github.com/Daniel127/EF-Unit-Of-Work/workflows/Build/badge.svg?branch=master\n[GitHubBadgeDevelop]: https://github.com/Daniel127/EF-Unit-Of-Work/workflows/Build/badge.svg?branch=develop\n[GitHubActionsLink]: https://github.com/Daniel127/EF-Unit-Of-Work/actions?query=workflow%3ABuild\n\n[AzureBadgeMaster]: https://dev.azure.com/Daniel127/Entity%20Framework%20-%20Unit%20Of%20Work/_apis/build/status/CI-Release?branchName=master\n[AzurePipelineMaster]: https://dev.azure.com/Daniel127/Entity%20Framework%20-%20Unit%20Of%20Work/_build/latest?definitionId=9\u0026branchName=master\n[AzureBadgeDevelop]: https://dev.azure.com/Daniel127/Entity%20Framework%20-%20Unit%20Of%20Work/_apis/build/status/CI-Development?branchName=develop\n[AzurePipelineDevelop]: https://dev.azure.com/Daniel127/Entity%20Framework%20-%20Unit%20Of%20Work/_build/latest?definitionId=10\u0026branchName=develop\n\n[NugetUrl]: https://www.nuget.org/packages/QD.EntityFrameworkCore.UnitOfWork\n[NugetBadge]: https://feeds.dev.azure.com/Daniel127/9d57e78d-f822-418e-ad91-46858d16c35e/_apis/public/Packaging/Feeds/7646e5f2-1d15-485d-98ff-e07b2ae10dd2/Packages/c2532a3a-a889-4da9-b244-567a1ec13fd8/Badge\n\n| Branch | Build | Deployment |\n|:----:|:-------------:|:----:|\n| master | [![Build][GitHubBadgeMaster]][GitHubActionsLink]  [![Build Status][AzureBadgeMaster]][AzurePipelineMaster] | [![Nuget package][NugetBadge]][NugetUrl] |\n| develop | [![Build][GitHubBadgeDevelop]][GitHubActionsLink]  [![Build Status][AzureBadgeDevelop]][AzurePipelineDevelop] | N/A |\n\n\n# What is it?\nRepository and Unit of Work pattern implementation for Entity Framework Core 3.\n\n# How to use?\n\n## Installation\nInstall the Nuget packages. Use Abstractions for logic layers and the other with insfrastructure layer or monolithic project.\n\n```powershell\ndotnet add package QD.EntityFrameworkCore.UnitOfWork\ndotnet add package QD.EntityFrameworkCore.UnitOfWork.Abstractions\n```\n\n## Register Services\n\n```csharp\npublic class AppDbContext : DbContext, IDbContext\n{\n    public DbSet\u003cProduct\u003e Products { get; set; }\n\n    public AppDbContext(DbContextOptions\u003cAppDbContext\u003e options) : base(options)\n    {\n    }\n\n    ...\n    ...\n}\n```\n\n```csharp\npublic void ConfigureServices(IServiceCollection services)\n{\n    services.AddDbContext\u003cAppDbContext\u003e(builder =\u003e\n    {\n        ...\n    });\n\n#region Register UnitOfWorks\n    // Register a IUnitOfWork\u003cAppDbContext\u003e\n    _services.AddUnitOfWork\u003cAppDbContext\u003e();\n    // Register a IUnitOfWork\u003cAppDbContext\u003e and IUnitOfWork\n    _services.AddUnitOfWork\u003cAppDbContext\u003e(onlyGeneric: false);\n#endregion\n\n    // Optional, register custom repositories\n    _services.AddRepository\u003cProduct, ProductRepository\u003e();\n    _services.AddReadOnlyRepository\u003cProduct, ProductReadOnlyRepository\u003e();\n}\n```\n\n## Use the services\n\n```csharp\npublic class FancyService : IFancyService\n{\n    private readonly IUnitOfWork\u003cAppDbContext\u003e _unitOfWork;\n\n    public FancyService(IUnitOfWork\u003cAppDbContext\u003e unitOfWork)\n    {\n        _unitOfWork = unitOfWork;\n    }\n\n    public void DoFancyThing()\n    {\n        var productsRepository = _unitOfWork.GetRepository\u003cProduct\u003e();\n\n        var products = productsRepository.GetAll();\n\n        ...\n        // Use inserts, updates, deletes.\n        ...\n\n        _unitOfWork.SaveChanges();\n    }\n}\n```\n\n## Paged Collections (v2.0)\n\n```csharp\npublic void FancyFunction()\n{\n    // These are some examples\n\n    // Array\n    IPagedCollection\u003cProduct\u003e page1 = _productsRepository.GetPagedArray(20, 0, product =\u003e product.Price \u003e 500);\n    IPagedCollection\u003cProduct\u003e page2 = await _productsRepository.GetPagedArrayAsync(\n        pageSize: 10,\n        orderBy: query =\u003e query.OrderBy(product =\u003e product.Price).ThenBy(product =\u003e product.Name)\n    );\n    // Indexers\n    var a = page1[1].Price;\n    var b = ((PagedArray\u003cProduct\u003e)page1)[2].Price;\n\n    ...\n\n    // List\n    IPagedCollection\u003cProduct\u003e page1 = _productsRepository.GetPagedList(20, 0, product =\u003e product.Price \u003e 500);\n    IPagedCollection\u003cProduct\u003e page2 = await _productsRepository.GetPagedListAsync(\n        pageSize: 10,\n        orderBy: query =\u003e query.OrderBy(product =\u003e product.Price).ThenBy(product =\u003e product.Name)\n    );\n    // Indexers\n    var a = page1[1].Price;\n    var b = ((PagedList\u003cProduct\u003e)page1)[2].Price;\n\n    ...\n\n    // Dictionary\n    IPagedCollection\u003cKeyValuePair\u003cGuid, Product\u003e\u003e page1 = _productsRepository.GetPagedDictionary(product =\u003e product.Id, 20, 0, product =\u003e product.Price \u003e 500);\n    IPagedCollection\u003cKeyValuePair\u003cGuid, Product\u003e\u003e page2 = await _productsRepository.GetPagedDictionaryAsync(\n        keySelector: product =\u003e product.Id,\n        pageSize: 10,\n        orderBy: query =\u003e query.OrderBy(product =\u003e product.Price).ThenBy(product =\u003e product.Name)\n    );\n    // Indexers\n    var a = page1[1].Value.Price;\n    var b = ((PagedDictionary\u003cGuid, Product\u003e)page1)[Guid.Parse(\"5926d548-c0b3-4c40-b37f-e89be7741024\")].Price;\n}\n```\n\nThe before methods are same that\n\n```csharp\n    GetAll(predicate, orderBy).ToPagedArray(pageSize, pageNumber);\n    GetAll(predicate, orderBy).ToPagedListAsync(pageSize, pageNumber);\n    GetAll(predicate, orderBy).ToPagedDictionary(keySelector, pageSize, pageNumber);\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaniel127%2Fef-unit-of-work","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdaniel127%2Fef-unit-of-work","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaniel127%2Fef-unit-of-work/lists"}