{"id":19070660,"url":"https://github.com/bobobass84/bb84.entityframeworkcore","last_synced_at":"2026-02-22T09:43:11.098Z","repository":{"id":231334567,"uuid":"781501662","full_name":"BoBoBaSs84/BB84.EntityFrameworkCore","owner":"BoBoBaSs84","description":"A reusable repository pattern in ASP.NET Core. Contains commonly used entity abstractions, their default implementations and repository abstractions with their default implementations.","archived":false,"fork":false,"pushed_at":"2025-04-15T05:31:34.000Z","size":14394,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-18T17:19:24.871Z","etag":null,"topics":["csharp","ef-core","entity-framework-core","library"],"latest_commit_sha":null,"homepage":"https://bobobass84.github.io/BB84.EntityFrameworkCore/","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/BoBoBaSs84.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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}},"created_at":"2024-04-03T14:00:19.000Z","updated_at":"2025-04-15T05:31:36.000Z","dependencies_parsed_at":"2024-07-13T07:32:56.040Z","dependency_job_id":"982a3ebf-166f-4217-8f04-f765183800ed","html_url":"https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore","commit_stats":null,"previous_names":["bobobass84/bb84.entityframeworkcore"],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BoBoBaSs84%2FBB84.EntityFrameworkCore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BoBoBaSs84%2FBB84.EntityFrameworkCore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BoBoBaSs84%2FBB84.EntityFrameworkCore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BoBoBaSs84%2FBB84.EntityFrameworkCore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BoBoBaSs84","download_url":"https://codeload.github.com/BoBoBaSs84/BB84.EntityFrameworkCore/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251328377,"owners_count":21571907,"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":["csharp","ef-core","entity-framework-core","library"],"created_at":"2024-11-09T01:19:54.246Z","updated_at":"2026-02-22T09:43:11.093Z","avatar_url":"https://github.com/BoBoBaSs84.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BB84.EntityFrameworkCore\n\n[![CI](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore/actions/workflows/ci.yml)\n[![CD](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore/actions/workflows/cd.yml/badge.svg?branch=main)](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore/actions/workflows/cd.yml)\n[![CodeQL](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore/actions/workflows/github-code-scanning/codeql/badge.svg?branch=main)](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore/actions/workflows/github-code-scanning/codeql)\n[![Dependabot](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore/actions/workflows/dependabot/dependabot-updates/badge.svg?branch=main)](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore/actions/workflows/dependabot/dependabot-updates)\n\n[![.NET](https://img.shields.io/badge/net8.0-5C2D91?logo=.NET\u0026labelColor=gray)](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore)\n[![.NET](https://img.shields.io/badge/net10.0-5C2D91?logo=.NET\u0026labelColor=gray)](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore)\n[![C#](https://img.shields.io/badge/C%23-13.0-239120)](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore)\n[![Issues](https://img.shields.io/github/issues/BoBoBaSs84/BB84.EntityFrameworkCore)](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore/issues)\n[![Commit](https://img.shields.io/github/last-commit/BoBoBaSs84/BB84.EntityFrameworkCore)](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore/commit/main)\n[![License](https://img.shields.io/github/license/BoBoBaSs84/BB84.EntityFrameworkCore)](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore/blob/main/LICENSE)\n[![RepoSize](https://img.shields.io/github/repo-size/BoBoBaSs84/BB84.EntityFrameworkCore)](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore)\n[![Release](https://img.shields.io/github/v/release/BoBoBaSs84/BB84.EntityFrameworkCore)](https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore/releases/latest)\n\n## 🧭 Overview\n\n**BB84.EntityFrameworkCore** is a comprehensive .NET 8.0 \u0026 .NET 10.0 library that provides a reusable repository pattern implementation for ASP.NET Core applications. The library offers commonly used entity abstractions, their default implementations, and repository abstractions with their corresponding implementations, specifically designed to work seamlessly with Entity Framework Core.\n\n### Key Features\n\n- **Generic Repository Pattern**: Complete implementation of the repository pattern with CRUD operations\n- **Entity Abstractions**: Pre-built interfaces for common entity types (Identity, Audited, Composite, etc.)\n- **SQL Server Integration**: Specialized configurations and extensions for SQL Server\n- **Auditing Support**: Built-in support for creation and modification tracking\n- **Soft Delete**: Integrated soft delete functionality\n- **Concurrency Control**: Built-in optimistic concurrency support\n- **Type Safety**: Strongly typed implementations with generic constraints\n\n### Target Framework\n\n- **.NET 8.0** - LTS support until November 2026\n- **.NET 10.0** - Latest LTS version of .NET\n\n## 🏗 Project Structure\n\n```\nBB84.EntityFrameworkCore/\n├── src/                                                    # Source code\n│   ├── BB84.EntityFrameworkCore.Entities.Abstractions/     # Entity interfaces\n│   ├── BB84.EntityFrameworkCore.Entities/                  # Entity implementations\n│   ├── BB84.EntityFrameworkCore.Repositories.Abstractions/ # Repository interfaces\n│   ├── BB84.EntityFrameworkCore.Repositories/              # Repository implementations\n│   └── BB84.EntityFrameworkCore.Repositories.SqlServer/    # SQL Server specific features\n├── tests/                                                  # Unit tests\n│   ├── BB84.EntityFrameworkCore.Entities.Tests/\n│   └── BB84.EntityFrameworkCore.Repositories.Tests/\n├── docs/                                                   # Documentation\n├── Directory.Build.props                                   # Build configuration\n├── Directory.Packages.props                                # Package management\n└── BB84.EntityFrameworkCore.sln                            # Solution file\n```\n\n## 📦 Package Architecture\n\nThe project is organized into five distinct NuGet packages, each serving a specific purpose:\n\n### BB84.EntityFrameworkCore.Entities.Abstractions\n\n**Purpose**: Core entity interface definitions\n**Dependencies**: None\n\nThis package contains the fundamental interfaces that define the contract for different types of entities:\n\n- `IIdentityEntity\u003cTKey\u003e` - Entities with unique identifiers\n- `IAuditedEntity\u003cTKey, TCreator, TEdited\u003e` - Entities with creation/modification tracking\n- `IFullAuditedEntity\u003cTKey, TCreator, TEdited\u003e` - Entities with full audit trails including soft delete\n- `ICompositeEntity` - Entities with composite keys\n- `IEnumeratorEntity\u003cTKey\u003e` - Entities representing enumeration values\n\n**Component Interfaces**:\n\n- `IIdentity\u003cTKey\u003e` - Provides unique identification\n- `IConcurrency` - Provides optimistic concurrency control\n- `ITimeAudited` - Tracks creation and modification timestamps\n- `IUserAudited\u003cTCreator, TEdited\u003e` - Tracks user information for auditing\n- `ISoftDeletable` - Provides soft delete functionality\n\n### BB84.EntityFrameworkCore.Entities\n\n**Purpose**: Default implementations of entity abstractions\n**Dependencies**: BB84.EntityFrameworkCore.Entities.Abstractions\n\nProvides concrete implementations of the entity interfaces:\n\n- `IdentityEntity\u003cTKey\u003e` - Base class for entities with identity\n- `AuditedEntity\u003cTKey, TCreator, TEdited\u003e` - Base class for audited entities\n- `FullAuditedEntity\u003cTKey, TCreator, TEdited\u003e` - Base class for fully audited entities\n- `CompositeEntity` - Base class for composite key entities\n- `EnumeratorEntity\u003cTKey\u003e` - Base class for enumeration entities\n\n### BB84.EntityFrameworkCore.Repositories.Abstractions\n\n**Purpose**: Repository interface definitions\n**Dependencies**:\n\n- BB84.EntityFrameworkCore.Entities.Abstractions\n- Microsoft.EntityFrameworkCore.Relational (9.0.6)\n\nCore repository interfaces:\n\n- `IDbContext` - Database context abstraction\n- `IGenericRepository\u003cTEntity\u003e` - Generic CRUD operations\n- `IIdentityRepository\u003cTEntity, TKey\u003e` - Repository for identity-based entities\n- `IEnumeratorRepository\u003cTEntity, TKey\u003e` - Repository for enumeration entities\n\n### BB84.EntityFrameworkCore.Repositories\n\n**Purpose**: Default repository implementations\n**Dependencies**:\n\n- BB84.EntityFrameworkCore.Entities\n- BB84.EntityFrameworkCore.Repositories.Abstractions\n\nConcrete repository implementations:\n\n- `GenericRepository\u003cTEntity\u003e` - Base repository with common operations\n- `IdentityRepository\u003cTEntity, TKey\u003e` - Repository for identity entities\n- `EnumeratorRepository\u003cTEntity, TKey\u003e` - Repository for enumerator entities\n\n### BB84.EntityFrameworkCore.Repositories.SqlServer\n\n**Purpose**: SQL Server specific configurations and extensions\n**Dependencies**: BB84.EntityFrameworkCore.Repositories\n\nSQL Server specific features:\n\n- **Configurations**: Entity type configurations for different entity types\n- **Extensions**: Extension methods for Entity Framework configurations\n- **Interceptors**: Database interceptors for auditing and soft delete\n\n## 💭 Core Concepts\n\n### Entity Hierarchy\n\nThe library follows a hierarchical approach to entity design:\n\n```\nIIdentityEntity\u003cTKey\u003e\n├── IAuditedEntity\u003cTKey, TCreator, TEdited\u003e\n│   └── IFullAuditedEntity\u003cTKey, TCreator, TEdited\u003e\n├── ICompositeEntity\n│   └── IAuditedCompositeEntity\u003cTCreator, TEdited\u003e\n└── IEnumeratorEntity\u003cTKey\u003e\n```\n\n### Repository Pattern\n\nThe repository pattern implementation provides:\n\n- **Separation of Concerns**: Business logic separated from data access\n- **Testability**: Easy mocking and unit testing\n- **Consistency**: Standardized data access patterns\n- **Flexibility**: Support for different entity types and requirements\n\n## ✨ Entity Abstractions\n\n### Identity Entities\n\nIdentity entities represent the most basic entity type with a unique identifier and concurrency control.\n\n```csharp\npublic interface IIdentityEntity\u003cTKey\u003e : IIdentity\u003cTKey\u003e, IConcurrency\n    where TKey : IEquatable\u003cTKey\u003e\n{\n    // Inherits:\n    // TKey Id { get; set; }           // From IIdentity\u003cTKey\u003e\n    // byte[]? Timestamp { get; set; } // From IConcurrency\n}\n\n// Default implementation with Guid\npublic interface IIdentityEntity : IIdentityEntity\u003cGuid\u003e\n```\n\n**Key Features**:\n\n- Unique identifier of specified type\n- Optimistic concurrency control via timestamp\n- Base interface for all other entity types\n\n### Audited Entities\n\nAudited entities extend identity entities with creation and modification tracking.\n\n```csharp\npublic interface IAuditedEntity\u003cTKey, TCreator, TEdited\u003e :\n    IIdentityEntity\u003cTKey\u003e, IUserAudited\u003cTCreator, TEdited\u003e\n    where TKey : IEquatable\u003cTKey\u003e\n    where TCreator : notnull\n{\n    // Inherits from IIdentityEntity\u003cTKey\u003e:\n    // TKey Id { get; set; }\n    // byte[]? Timestamp { get; set; }\n\n    // Inherits from IUserAudited\u003cTCreator, TEdited\u003e:\n    // TCreator CreatedBy { get; set; }\n    // TEdited? EditedBy { get; set; }\n    // DateTimeOffset CreatedAt { get; set; }\n    // DateTimeOffset? EditedAt { get; set; }\n}\n```\n\n**Convenience Overloads**:\n\n```csharp\n// Default string-based user types\npublic interface IAuditedEntity\u003cTKey\u003e : IAuditedEntity\u003cTKey, string, string?\u003e\n\n// Default Guid key with string users\npublic interface IAuditedEntity : IAuditedEntity\u003cGuid, string, string?\u003e\n```\n\n### Full Audited Entities\n\nFull audited entities include soft delete capabilities in addition to standard auditing.\n\n```csharp\npublic interface IFullAuditedEntity\u003cTKey, TCreator, TEdited\u003e :\n    IAuditedEntity\u003cTKey, TCreator, TEdited\u003e, ISoftDeletable\n    where TKey : IEquatable\u003cTKey\u003e\n    where TCreator : notnull\n{\n    // Inherits all from IAuditedEntity plus:\n    // bool IsDeleted { get; set; }      // From ISoftDeletable\n}\n```\n\n### Composite Entities\n\nComposite entities are designed for entities with composite primary keys.\n\n```csharp\npublic interface ICompositeEntity : IConcurrency\n{\n    // byte[]? Timestamp { get; set; } // From IConcurrency\n}\n\npublic interface IAuditedCompositeEntity\u003cTCreator, TEdited\u003e :\n    ICompositeEntity, IUserAudited\u003cTCreator, TEdited\u003e\n    where TCreator : notnull\n```\n\n### Enumerator Entities\n\nEnumerator entities represent lookup/reference data with additional descriptive properties.\n\n```csharp\npublic interface IEnumeratorEntity\u003cTKey\u003e : IIdentityEntity\u003cTKey\u003e\n    where TKey : IEquatable\u003cTKey\u003e\n{\n    // Inherits from IIdentityEntity\u003cTKey\u003e plus:\n    string Name { get; set; }\n    string? Description { get; set; }\n}\n```\n\n## ⚡ Repository Pattern\n\n### Generic Repository\n\nThe `IGenericRepository\u003cTEntity\u003e` provides standard CRUD operations, just to name a few:\n\n```csharp\npublic interface IGenericRepository\u003cTEntity\u003e where TEntity : class\n{\n    // Create operations\n    void Create(TEntity entity);\n    void Create(IEnumerable\u003cTEntity\u003e entities);\n    Task CreateAsync(TEntity entity, CancellationToken cancellationToken = default);\n    Task CreateAsync(IEnumerable\u003cTEntity\u003e entities, CancellationToken cancellationToken = default);\n\n    // Read operations\n    IEnumerable\u003cTEntity\u003e GetAll(bool ignoreQueryFilters = false, bool trackChanges = false);\n    Task\u003cIEnumerable\u003cTEntity\u003e\u003e GetAllAsync(bool ignoreQueryFilters = false, bool trackChanges = false, CancellationToken token = default);\n\n    // Update operations\n    void Update(TEntity entity);\n    void Update(IEnumerable\u003cTEntity\u003e entities);\n    Task UpdateAsync(TEntity entity);\n    Task UpdateAsync(IEnumerable\u003cTEntity\u003e entities);\n\n    // Delete operations\n    void Delete(TEntity entity);\n    void Delete(IEnumerable\u003cTEntity\u003e entities);\n    Task DeleteAsync(TEntity entity);\n    Task DeleteAsync(IEnumerable\u003cTEntity\u003e entities);\n\n    // Query operations\n    int CountAll(bool ignoreQueryFilters = false);\n    Task\u003cint\u003e CountAllAsync(bool ignoreQueryFilters = false, CancellationToken token = default);\n}\n```\n\n### Identity Repository\n\nSpecialized repository for identity-based entities:\n\n```csharp\npublic interface IIdentityRepository\u003cTEntity, TKey\u003e : IGenericRepository\u003cTEntity\u003e\n    where TEntity : class, IIdentityEntity\u003cTKey\u003e\n    where TKey : IEquatable\u003cTKey\u003e\n{\n    // Strongly-typed ID operations\n    TEntity? GetById(TKey id);\n    Task\u003cTEntity?\u003e GetByIdAsync(TKey id, CancellationToken cancellationToken = default);\n    void Delete(TKey id);\n    Task DeleteAsync(TKey id, CancellationToken cancellationToken = default);\n}\n```\n\n## ⭐ Configuration Classes\n\nThe SQL Server package provides base configuration classes for Entity Framework Core entity type configurations.\n\n### Identity Configuration\n\n```csharp\npublic abstract class IdentityConfiguration\u003cTEntity, TKey\u003e : IEntityTypeConfiguration\u003cTEntity\u003e\n    where TEntity : class, IIdentityEntity\u003cTKey\u003e\n    where TKey : IEquatable\u003cTKey\u003e\n{\n    public virtual void Configure(EntityTypeBuilder\u003cTEntity\u003e builder)\n    {\n        // Configures primary key, timestamps, and common properties\n    }\n}\n```\n\n### Audited Configuration\n\n```csharp\npublic abstract class AuditedConfiguration\u003cTEntity, TKey, TCreator, TEdited\u003e : IEntityTypeConfiguration\u003cTEntity\u003e\n    where TEntity : class, IAuditedEntity\u003cTKey, TCreator, TEdited\u003e\n    where TKey : IEquatable\u003cTKey\u003e\n    where TCreator : notnull\n{\n    public virtual void Configure(EntityTypeBuilder\u003cTEntity\u003e builder)\n    {\n        // Configures auditing fields, required properties, and indexes\n    }\n}\n```\n\n### Full Audited Configuration\n\n```csharp\npublic abstract class FullAuditedConfiguration\u003cTEntity, TKey, TCreator, TEdited\u003e : IEntityTypeConfiguration\u003cTEntity\u003e\n    where TEntity : class, IFullAuditedEntity\u003cTKey, TCreator, TEdited\u003e\n    where TKey : IEquatable\u003cTKey\u003e\n    where TCreator : notnull\n{\n    public virtual void Configure(EntityTypeBuilder\u003cTEntity\u003e builder)\n    {\n        // Configures full auditing including soft delete capabilities\n    }\n}\n```\n\n## 🔮 Interceptors\n\nThe library provides Entity Framework Core interceptors for automatic handling of common scenarios.\n\n### Time Audited Interceptor\n\nAutomatically sets `Created` and `Edited` timestamps:\n\n```csharp\npublic class TimeAuditedInterceptor : SaveChangesInterceptor\n{\n    // Automatically updates timestamps on save operations\n}\n```\n\n### Soft Deletable Interceptor\n\nHandles soft delete operations by setting `IsDeleted`:\n\n```csharp\npublic class SoftDeletableInterceptor : SaveChangesInterceptor\n{\n    // Converts hard deletes to soft deletes for applicable entities\n}\n```\n\n## 💻 Getting Started\n\n### Installation\n\nInstall the packages via NuGet Package Manager or .NET CLI:\n\n```powershell\n# For entity abstractions only\ndotnet add package BB84.EntityFrameworkCore.Entities.Abstractions\n\n# For entity implementations\ndotnet add package BB84.EntityFrameworkCore.Entities\n\n# For repository abstractions\ndotnet add package BB84.EntityFrameworkCore.Repositories.Abstractions\n\n# For repository implementations\ndotnet add package BB84.EntityFrameworkCore.Repositories\n\n# For SQL Server specific features\ndotnet add package BB84.EntityFrameworkCore.Repositories.SqlServer\n```\n\n### Basic Setup\n\n1. **Define your entities**:\n\n```csharp\npublic class User : AuditedEntity\n{\n    public string FirstName { get; set; } = string.Empty;\n    public string LastName { get; set; } = string.Empty;\n    public string Email { get; set; } = string.Empty;\n}\n\npublic class Product : FullAuditedEntity\n{\n    public string Name { get; set; } = string.Empty;\n    public decimal Price { get; set; }\n    public string? Description { get; set; }\n}\n```\n\n2. **Create repository interfaces**:\n\n```csharp\npublic interface IUserRepository : IIdentityRepository\u003cUser\u003e\n{\n    Task\u003cUser?\u003e GetByEmailAsync(string email, CancellationToken cancellationToken = default);\n}\n\npublic interface IProductRepository : IIdentityRepository\u003cProduct\u003e\n{\n    Task\u003cIEnumerable\u003cProduct\u003e\u003e GetActiveProductsAsync(CancellationToken cancellationToken = default);\n}\n```\n\n3. **Implement repositories**:\n\n```csharp\npublic class UserRepository : IdentityRepository\u003cUser\u003e, IUserRepository\n{\n    public UserRepository(IDbContext dbContext) : base(dbContext) { }\n\n    public async Task\u003cUser?\u003e GetByEmailAsync(string email, CancellationToken cancellationToken = default)\n    {\n        return await GetByConditionAsync(u =\u003e u.Email == email, token: cancellationToken);\n    }\n}\n\npublic class ProductRepository : IdentityRepository\u003cProduct\u003e, IProductRepository\n{\n    public ProductRepository(IDbContext dbContext) : base(dbContext) { }\n\n    public async Task\u003cIEnumerable\u003cProduct\u003e\u003e GetActiveProductsAsync(CancellationToken cancellationToken = default)\n    {\n        return await GetManyByConditionAsync(p =\u003e !p.IsDeleted, token: cancellationToken);\n    }\n}\n```\n\n4. **Configure Entity Framework**:\n\n```csharp\npublic class ApplicationDbContext : DbContext, IDbContext\n{\n    public ApplicationDbContext(DbContextOptions\u003cApplicationDbContext\u003e options) : base(options) { }\n\n    public DbSet\u003cUser\u003e Users { get; set; }\n    public DbSet\u003cProduct\u003e Products { get; set; }\n\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\n    {\n        base.OnModelCreating(modelBuilder);\n        modelBuilder.ApplyConfigurationsFromAssembly(typeof(ApplicationDbContext).Assembly);\n    }\n}\n\n// Entity configurations\npublic class UserConfiguration : AuditedConfiguration\u003cUser\u003e\n{\n    public override void Configure(EntityTypeBuilder\u003cUser\u003e builder)\n    {\n        builder.Property(u =\u003e u.Email).IsRequired().HasMaxLength(255);\n        builder.HasIndex(u =\u003e u.Email).IsUnique();\n\n        base.Configure(builder);\n    }\n}\n\npublic class ProductConfiguration : FullAuditedConfiguration\u003cProduct\u003e\n{\n    public override void Configure(EntityTypeBuilder\u003cProduct\u003e builder)\n    {\n        builder.Property(p =\u003e p.Name).IsRequired().HasMaxLength(200);\n        builder.Property(p =\u003e p.Price).HasPrecision(18, 2);\n\n        base.Configure(builder);\n    }\n}\n```\n\n5. **Register services**:\n\n```csharp\npublic void ConfigureServices(IServiceCollection services)\n{\n    services.AddDbContext\u003cApplicationDbContext\u003e(options =\u003e\n        options.UseSqlServer(connectionString));\n\n    services.AddScoped\u003cIDbContext\u003e(provider =\u003e provider.GetService\u003cApplicationDbContext\u003e());\n    services.AddScoped\u003cIUserRepository, UserRepository\u003e();\n    services.AddScoped\u003cIProductRepository, ProductRepository\u003e();\n\n    // Register interceptors\n    services.AddScoped\u003cTimeAuditedInterceptor\u003e();\n    services.AddScoped\u003cSoftDeletableInterceptor\u003e();\n}\n```\n\n## 🧰 Usage Examples\n\n### Basic CRUD Operations\n\n```csharp\npublic class UserService\n{\n    private readonly IUserRepository _userRepository;\n    private readonly IDbContext _dbContext;\n\n    public UserService(IUserRepository userRepository, IDbContext dbContext)\n    {\n        _userRepository = userRepository;\n        _dbContext = dbContext;\n    }\n\n    public async Task\u003cUser\u003e CreateUserAsync(string firstName, string lastName, string email)\n    {\n        var user = new User\n        {\n            FirstName = firstName,\n            LastName = lastName,\n            Email = email,\n            CreatedBy = \"system\" // Will be set automatically by interceptor\n        };\n\n        await _userRepository.CreateAsync(user);\n        await _dbContext.SaveChangesAsync();\n\n        return user;\n    }\n\n    public async Task\u003cUser?\u003e GetUserByEmailAsync(string email)\n    {\n        return await _userRepository.GetByEmailAsync(email);\n    }\n\n    public async Task UpdateUserAsync(User user)\n    {\n        _userRepository.Update(user);\n        await _dbContext.SaveChangesAsync();\n    }\n\n    public async Task DeleteUserAsync(Guid userId)\n    {\n        await _userRepository.DeleteByIdAsync(userId);\n        await _dbContext.SaveChangesAsync();\n    }\n}\n```\n\n### Advanced Querying\n\n```csharp\npublic class ProductService\n{\n    private readonly IProductRepository _productRepository;\n\n    public ProductService(IProductRepository productRepository)\n    {\n        _productRepository = productRepository;\n    }\n\n    public async Task\u003cIEnumerable\u003cProduct\u003e\u003e SearchProductsAsync(string searchTerm, decimal? minPrice = null)\n    {\n        return await _productRepository.GetManyByConditionAsync(p =\u003e\n            !p.IsDeleted \u0026\u0026\n            p.Name.Contains(searchTerm) \u0026\u0026\n            (minPrice == null || p.Price \u003e= minPrice));\n    }\n}\n```\n\n## 🩺 Testing\n\nThe project includes comprehensive unit tests for all components:\n\n### Test Projects\n\n- **BB84.EntityFrameworkCore.Entities.Tests**: Tests for entity implementations\n- **BB84.EntityFrameworkCore.Repositories.Tests**: Tests for repository implementations\n\n### Test Coverage Areas\n\n1. **Entity Tests**: Verify entity behavior and property assignments\n2. **Repository Tests**: Test CRUD operations and query functionality\n3. **Configuration Tests**: Validate Entity Framework configurations\n4. **Interceptor Tests**: Test automatic auditing and soft delete behavior\n\n### Example Test\n\n```csharp\n[TestClass]\npublic sealed class IdentityEntityTests\n{\n    [TestMethod]\n    public void IdentityEntityTest()\n    {\n        IIdentityEntity? entity;\n        Guid id = Guid.NewGuid();\n\n        entity = new TestClass()\n        {\n            Id = id\n        };\n\n        Assert.IsNotNull(entity);\n        Assert.AreEqual(id, entity.Id);\n        Assert.IsNull(entity.Timestamp);\n    }\n\n    private sealed class TestClass : IdentityEntity\n    { }\n}\n```\n\n### Running Tests\n\n```powershell\n# Run all tests\ndotnet test\n\n# Run tests with coverage\ndotnet test --collect:\"XPlat Code Coverage\"\n\n# Run specific test project\ndotnet test tests/BB84.EntityFrameworkCore.Entities.Tests/\n```\n\n## 🛠 Build and Deployment\n\n### Build Configuration\n\nThe project uses MSBuild properties defined in `Directory.Build.props`:\n\n- **Target Framework**: .NET 8.0 \u0026 .NET 10.0\n- **Language Version**: Latest C#\n- **Nullable**: Enabled\n- **Implicit Usings**: Enabled\n- **Documentation**: Generated for all projects\n\n### Version Management\n\nVersions are automatically generated based on:\n\n- Major: 4\n- Minor: 2\n- Patch: Current date (MMDD format)\n- Revision: Current hour\n\n### Package Information\n\n- **Author**: BoBoBaSs84\n- **License**: MIT\n- **Repository**: https://github.com/BoBoBaSs84/BB84.EntityFrameworkCore\n\n### Build Commands\n\n```powershell\n# Restore packages\ndotnet restore\n\n# Build solution\ndotnet build\n\n# Build release\ndotnet build --configuration Release\n\n# Pack NuGet packages\ndotnet pack --configuration Release\n```\n\n### CI/CD Pipeline\n\nThe project uses GitHub Actions for:\n\n- **Continuous Integration (CI)**: Automated building and testing\n- **Continuous Deployment (CD)**: Automated package publishing\n- **Code Analysis**: CodeQL security scanning\n- **Dependency Updates**: Dependabot automated updates\n\n## 📚 API Documentation\n\nComplete API documentation is available [here](https://bobobass84.github.io/BB84.EntityFrameworkCore).\n\nThe documentation is generated using DocFX and includes:\n\n- Complete API reference for all public types\n- Code examples and usage patterns\n- Cross-references between related types\n- Inheritance hierarchies\n\n### Documentation Structure\n\n```\ndocs/\n├── docfx.json   # DocFX configuration\n├── index.md     # Documentation homepage\n├── toc.yml      # Table of contents\n└── api/\n    └── index.md # API reference index\n```\n\n## 🤝 Contributing\n\n### Development Guidelines\n\n1. **Code Style**: Follow Microsoft C# coding conventions\n2. **Documentation**: All public APIs must be documented with XML comments\n3. **Testing**: All new features must include corresponding unit tests\n4. **Breaking Changes**: Follow semantic versioning principles\n\n### Contribution Process\n\n1. Fork the repository\n2. Create a feature branch\n3. Implement changes with tests\n4. Update documentation as needed\n5. Submit a pull request\n\n### Code of Conduct\n\nThis project adheres to the Contributor Covenant Code of Conduct. See the [CODE_OF_CONDUCT](CODE_OF_CONDUCT.md) file for details.\n\n## ⚖ License\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbobobass84%2Fbb84.entityframeworkcore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbobobass84%2Fbb84.entityframeworkcore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbobobass84%2Fbb84.entityframeworkcore/lists"}