SampleDotnet.RepositoryFactory 1.0.0

Additional Details

rollback mechanism is not secure. (requires commit to apply)

There is a newer version of this package available.
See the version list below for details.
dotnet add package SampleDotnet.RepositoryFactory --version 1.0.0
NuGet\Install-Package SampleDotnet.RepositoryFactory -Version 1.0.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="SampleDotnet.RepositoryFactory" Version="1.0.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add SampleDotnet.RepositoryFactory --version 1.0.0
#r "nuget: SampleDotnet.RepositoryFactory, 1.0.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install SampleDotnet.RepositoryFactory as a Cake Addin
#addin nuget:?package=SampleDotnet.RepositoryFactory&version=1.0.0

// Install SampleDotnet.RepositoryFactory as a Cake Tool
#tool nuget:?package=SampleDotnet.RepositoryFactory&version=1.0.0

Nuget CodeQL MIT

EFCore DbContext RepositoryFactory Pattern managed by DbContextFactory

EntityFrameworkCore doesn't support multiple parallel operations, when we need parallel actions in different threads such as adding or deleting on the same DbContext, It throws an exception when calling SaveChanges source.

NOTE: DbContext service scope set as Transient which managed by IServiceScopeFactory

How to Use

using SampleDotnet.RepositoryFactory;

ServiceCollection Definition

services.AddDbContextFactory<UserDbContext>(opt =>
    opt.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

then we call transient scoped DbContext

    public class UserController : ControllerBase
    {
        private readonly IDbContextFactory<UserDbContext> _contextFactory;

        public UserController(IDbContextFactory<UserDbContext> contextFactory)
        {
            _contextFactory = contextFactory;
        }

        [HttpGet("{id}")]
        public ActionResult Get(Guid id)
        {
            using (var repository = _contextFactory.CreateRepository())
            {
                var personal = repository.FirstOrDefault<UserEntity>(f => f.Id == id);

                //some operations goes here....

                repository.Delete(personal);

                //some operations goes here....

                repository.SaveChanges();
            }
        }
    }

Additional Feature

  • Changes Tracker for each Repository using 'IRepositoryEntryNotifier'
    • helps to manage entities before SaveChanges such as updating Adding or Updating Time on Entity

Usage Example of the IRepositoryEntryNotifier

  • we have a User entity which derived from IHasTimestamps, when we add a new User or delete a User this event will be triggered by Repository
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using SampleDotnet.RepositoryFactory.Interfaces;

namespace SampleDotnet.RepositoryFactory.Tests
{
    public class UserEntity : IHasTimestamps
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
        public string SurName { get; set; }

        public DateTime CreatedAt { get; set; }
        public DateTime UpdatedAt { get; set; }
    }

    public interface IHasTimestamps
    {
        DateTime CreatedAt { get; set; }
        DateTime UpdatedAt { get; set; }
    }

    public class MyRpositoryNotifier : IRepositoryEntryNotifier
    {
        public void RepositoryEntryEvent(object sender, EntityEntryEventArgs e, DbContext dbContext, IServiceProvider serviceProvider)
        {
            if (e.Entry.State == EntityState.Unchanged || e.Entry.State == EntityState.Detached)
                return;

            if (e.Entry.Entity is IHasTimestamps entityWithTimestamps)
            {
                switch (e.Entry.State)
                {
                    case EntityState.Added:
                        entityWithTimestamps.CreatedAt = DateTime.UtcNow;
                        break;

                    case EntityState.Modified:
                        entityWithTimestamps.UpdatedAt = DateTime.UtcNow;
                        break;

                    case EntityState.Deleted:
                        //entity deleted on the database
                        //entityWithTimestamps.DeletedAt = DateTime.UtcNow;
                        break;
                }
            }
        }
    }
}
  • ServiceCollection Definition (Singleton scope)
services.AddSingleton<IRepositoryEntryNotifier, MyRpositoryNotifier>();
  • after that call var repository = _contextFactory.CreateRepository(); and add or delete entity
Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
3.0.1 243 4/9/2023
3.0.0.5-alpha 156 4/8/2023
2.1.0 248 3/18/2023
2.0.0 245 3/13/2023
1.0.0 257 2/25/2023