EF-Repository-Pattern 1.2.3

dotnet add package EF-Repository-Pattern --version 1.2.3
                    
NuGet\Install-Package EF-Repository-Pattern -Version 1.2.3
                    
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="EF-Repository-Pattern" Version="1.2.3" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="EF-Repository-Pattern" Version="1.2.3" />
                    
Directory.Packages.props
<PackageReference Include="EF-Repository-Pattern" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add EF-Repository-Pattern --version 1.2.3
                    
#r "nuget: EF-Repository-Pattern, 1.2.3"
                    
#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.
#:package EF-Repository-Pattern@1.2.3
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=EF-Repository-Pattern&version=1.2.3
                    
Install as a Cake Addin
#tool nuget:?package=EF-Repository-Pattern&version=1.2.3
                    
Install as a Cake Tool

EF Core 6 - Generic Repository Pattern

Simple Generic Repository Pattern based on EF core 6 and Dependency Injection. To create any type of Repository based on the Context's DBSets.

How to use

In Sturtup after calling AddDbContext<TContext> you can call AddEFRepositoryPattern<TContext>()

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<MyContext>(options =>
    {
        options.UseInMemoryDatabase(databaseName: $"Select");
    });

    // You can use any type of Context. For ease we have used an inMemory
    services.AddEFRepositoryPattern<MyContext>();

    ...
}

public class MyContext : DbContext
{
    public DbSet<Customer> Customers { get; set; }
    public DbSet<Order> Orders { get; set; }
}

That's all, now you can use all reporitory you want only doing this

public class MyService {
    private readonly IRepositoryManager<MyContext> repositoryManager;

    public MyService(IRepositoryManager<MyContext> repositoryManager)
    {
        this.repositoryManager = repositoryManager;
    }

    public async Task AddCustomer()
    {
        // Create your Repository of Type Customer
        var repCustomer = repositoryManager.GenerateModelRepository<Customer>();

        var bCustomer = new Customer() { Id = 1, City = "New York", FirstName = "Liam" };
        await repCustomer.AddModelAsync(bCustomer);

        await repositoryManager.SaveChangesAsync();
    }

    public async Task AddDifferentEntitiesInOneTransaction()
    {
        // Create your Repository of Type Customer
        var repCustomer = repositoryManager.GenerateModelRepository<Customer>();

        // Adding some customers to DBSet
        await repCustomer.AddModelAsync(new Customer() { Id = 2, City = "San Diego", FirstName = "Liam" });
        await repCustomer.AddModelAsync(new Customer() { Id = 3, City = "Los Angeles" });
        await repCustomer.AddModelAsync(new Customer() { Id = 5, City = "New York", FirstName = "Noah" });
        await repCustomer.AddModelAsync(new Customer() { Id = 4, City = "Dallas" });

        // Create your Repository of Type Order
        var repOrder = repositoryManager.GenerateModelRepository<Order>();

        // Adding some customers to DBSet
        await repOrder.AddModelAsync(new Order() { Id = 1, TotalAmount= 100, Customer = bCustomer });
        await repOrder.AddModelAsync(new Order() { Id = 2, TotalAmount= 22, Customer = bCustomer });
        await repOrder.AddModelAsync(new Order() { Id = 3, TotalAmount= 67, Customer = bCustomer });

        // Save all in DB
        await repositoryManager.SaveChangesAsync();
    }

    public async Task GetCustomer()
    {
        // Create your Repository of Type Customer
        var repCustomer = repositoryManager.GenerateModelRepository<Customer>();

        // Get First Customer where City == "New York"
        var customer = await repCustomer.GetFirstModelAsync(x => x.City == "New York");

        // Get List of Customers where FirstName == Liam orderedBy City and include Orders
        var customers = await repCustomer.GetListModelsAsync(
            x => x.FirstName == "Liam",
            x => x.OrderBy(y => y.City),
            x => x.Include(y => y.Orders)
        );

        // Get AllList of Customers Order by City and FirstName
        var d = await repCustomer.GetListModelsAsync(
            orderByFunc: x => x.OrderBy(y => y.City).ThenBy(y => y.FirstName)
        );
    }
}

The method to search for a pattern by key is available. To use the GetModelByKeyAsync method, the model created via the GenerateModelRepository method must inherit from IBasePropertyKey<TKey> (otherwise the method will throw an error). TKey will set the type of the property id.

public class OrderItem: IBasePropertyKey<int>
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public int OrderId { get; set; }
}
    
public async Task GetExample(){
    var repOrderItem = repositoryManager.GenerateModelRepository<OrderItem>();
    
    // OrderItem inherit from IBasePropertyKey<TKey> then return correct OrderItem
    var ordItem = await repOrderItem.GetModelByKeyAsync(2);
    
    var repOrder = repositoryManager.GenerateModelRepository<Order>();
    
    // Order not inherit from IBasePropertyKey<TKey> then Throw an ArgumentException
    var ord = await repOrder.GetModelByKeyAsync((2);
}

Pager

Since version 1.1 I have added a GetPagerModelAsync method, which returns a PagerModel<TModel> where TModel is the type model of the repository class. The PagerModel class is composed as follows:

int PageIndex --> index of the page 
int PageSize --> size of the page
long TotalCount --> number of total element without page
IEnumerable<TModel> ListModels --> list of Models found

Support

Any help is welcome. Bug insertion, new methods to implement, code improvement... And don't forget, if you want to support me

<a href="https://www.buymeacoffee.com/DenMic" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>

Product Compatible and additional computed target framework versions.
.NET 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 was computed.  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.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.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
1.2.3 654 3/2/2022
1.2.2 595 3/2/2022
1.2.1 429 1/9/2022
1.2.0 449 1/9/2022
1.1.0 587 10/9/2021
1.0.1 498 10/7/2021
1.0.0 535 10/3/2021