Sufficit.EFData
1.26.430.2043
dotnet add package Sufficit.EFData --version 1.26.430.2043
NuGet\Install-Package Sufficit.EFData -Version 1.26.430.2043
<PackageReference Include="Sufficit.EFData" Version="1.26.430.2043" />
<PackageVersion Include="Sufficit.EFData" Version="1.26.430.2043" />
<PackageReference Include="Sufficit.EFData" />
paket add Sufficit.EFData --version 1.26.430.2043
#r "nuget: Sufficit.EFData, 1.26.430.2043"
#:package Sufficit.EFData@1.26.430.2043
#addin nuget:?package=Sufficit.EFData&version=1.26.430.2043
#tool nuget:?package=Sufficit.EFData&version=1.26.430.2043
<h1> Sufficit.EFData <a href="https://github.com/sufficit"><img src="https://avatars.githubusercontent.com/u/66928451?s=200&v=4" alt="Sufficit Logo" width="80" align="right"></a> </h1>
Entity Framework Data Providers for Sufficit Ecosystem
A comprehensive .NET library that provides Entity Framework-based data access providers for the Sufficit platform. This library implements the Provider Architecture Pattern with extension methods for optimal performance and maintainability.
π Table of Contents
- About
- Features
- Architecture
- Installation
- Usage
- Modules
- Configuration
- Development
- Contributing
- License
π About
Sufficit.EFData is a core component of the Sufficit ecosystem, providing standardized data access patterns using Entity Framework Core. The library implements a consistent provider architecture that ensures:
- Multi-target Framework Support: Compatible with .NET Standard 2.0, .NET 6.0, 7.0, 8.0, and 9.0
- Provider Pattern: Clean separation between data access logic and business logic
- Extension Methods: Convenient query methods without additional abstraction layers
- Dependency Injection: Seamless integration with Microsoft.Extensions.DependencyInjection
- Database Agnostic: Support for multiple database providers (MySQL, SQL Server, etc.)
Key Principles
- Single Responsibility: Each provider handles one specific domain
- Extension Methods: Business logic extensions without repository overhead
- Scoped Contexts: Proper DbContext lifecycle management
- Consistent API: Uniform interface across all providers
β¨ Features
π§ Core Features
- Multi-Framework Targeting: Supports .NET Standard 2.0+ and modern .NET versions
- Provider Architecture: Clean separation of data access concerns
- Extension Methods: Fluent API for complex queries
- Dependency Injection: Native support for IServiceCollection
- Database Providers: MySQL, SQL Server, and PostgreSQL support
- Migration Tools: Built-in database migration utilities
π Domain Modules
- Exchange: Email tracking, message templates, and communication logs
- Identity: User management and authentication data
- Contacts: Customer and contact information management
- Telephony: Call records, CDR data, and telephony operations
- Finance: Billing, payments, and financial transactions
- Statistics: Analytics and reporting data
- Storage: File and media storage management
- Tasks: Background job and task management
π οΈ Developer Experience
- IntelliSense Support: Full IDE integration
- Comprehensive Documentation: Detailed API documentation
- Code Examples: Practical usage samples
- Migration Tools: Database schema management
- Testing Support: Unit testing utilities
ποΈ Architecture
Provider Pattern Implementation
Sufficit.EFData/
βββ EFProvider<TContext> # Abstract base provider
βββ ScopedProvider # Scoped service management
βββ Extension Methods # Query extensions
βββ DbContext Implementations # Database contexts
Key Components
EFProvider Base Class
public abstract class EFProvider<DBContext> : ScopedProvider
where DBContext : Microsoft.EntityFrameworkCore.DbContext
{
protected EFProvider(IServiceScopeFactory serviceScopeFactory)
: base(serviceScopeFactory) { }
protected DBContext CreateDbContext(IServiceScope scope)
=> scope.ServiceProvider.GetRequiredService<DBContext>();
}
Extension Methods Pattern
public static class EFMessageTemplateProviderExtensions
{
public static async Task<MessageTemplate?> GetByTitleAsync(
this EFMessageTemplateProvider provider,
string title,
CancellationToken cancellationToken = default)
{
return await provider.Search(new MessageTemplateSearchParameters
{
Title = title
}).FirstOrDefaultAsync(cancellationToken);
}
}
Database Context Management
- Scoped Lifetime: DbContext instances are properly scoped
- Connection Pooling: Efficient database connection management
- Transaction Support: ACID transaction handling
- Migration Support: Automatic schema updates
π¦ Installation
NuGet Package
# Install via NuGet
dotnet add package Sufficit.EFData
# Or via Package Manager
Install-Package Sufficit.EFData
Package Reference
<PackageReference Include="Sufficit.EFData" Version="1.0.0" />
Prerequisites
- .NET Standard 2.0+ or .NET 6.0+
- Entity Framework Core packages
- Database Provider (MySQL, SQL Server, etc.)
π Usage
Basic Setup
// Program.cs or Startup.cs
using Microsoft.Extensions.DependencyInjection;
using Sufficit.EFData;
public void ConfigureServices(IServiceCollection services)
{
// Add database context
services.AddDbContext<ExchangeDbContext>(options =>
options.UseMySql(connectionString,
new MySqlServerVersion(new Version(8, 0, 21))));
// Register providers
services.AddSufficitEFData();
}
Using Providers
public class MessageService
{
private readonly EFMessageTemplateProvider _provider;
public MessageService(EFMessageTemplateProvider provider)
{
_provider = provider;
}
public async Task<MessageTemplate?> GetTemplateAsync(string title)
{
// Using extension method
return await _provider.GetByTitleAsync(title);
}
public async Task<IEnumerable<MessageTemplate>> SearchTemplatesAsync(
string? searchTerm = null,
int page = 1,
int pageSize = 20)
{
// Using base Search method
return await _provider.Search(new MessageTemplateSearchParameters
{
Title = searchTerm,
Paging = new PagingParameters { Page = page, PageSize = pageSize }
}).ToListAsync();
}
}
Advanced Queries
public async Task<IEnumerable<MessageTemplate>> GetActiveTemplatesAsync()
{
return await _provider.Search(new MessageTemplateSearchParameters
{
IsActive = true,
Sorting = new SortingParameters
{
SortBy = "CreatedAt",
SortDirection = SortDirection.Descending
}
}).ToListAsync();
}
π Modules
Exchange Module
Handles email templates, message tracking, and communication logs.
// Usage
public class EmailService
{
private readonly EFMessageTemplateProvider _templateProvider;
private readonly EFEMailTrackingProvider _trackingProvider;
public async Task SendTemplatedEmailAsync(string templateTitle, string recipient)
{
var template = await _templateProvider.GetByTitleAsync(templateTitle);
if (template == null) return;
// Send email logic here
await _trackingProvider.TrackEmailAsync(template.Id, recipient);
}
}
Identity Module
Manages user authentication and authorization data.
// Register Identity providers
services.AddSufficitIdentityProviders();
// Usage
public class UserService
{
private readonly EFIdentityProvider _identityProvider;
public async Task<User?> AuthenticateAsync(string username, string password)
{
return await _identityProvider.AuthenticateAsync(username, password);
}
}
Telephony Module
Handles call records, CDR data, and telephony operations.
// Register Telephony providers
services.AddSufficitTelephonyProviders();
// Usage
public class CallService
{
private readonly EFCallRecordProvider _callProvider;
public async Task<IEnumerable<CallRecord>> GetRecentCallsAsync(string extension)
{
return await _callProvider.Search(new CallRecordSearchParameters
{
Extension = extension,
DateRange = new DateTimeRange
{
Start = DateTime.UtcNow.AddDays(-7),
End = DateTime.UtcNow
}
}).ToListAsync();
}
}
βοΈ Configuration
Connection Strings
{
"ConnectionStrings": {
"ExchangeDb": "Server=localhost;Database=exchange;User=user;Password=password;",
"IdentityDb": "Server=localhost;Database=identity;User=user;Password=password;",
"TelephonyDb": "Server=localhost;Database=telephony;User=user;Password=password;"
}
}
Service Registration
public void ConfigureServices(IServiceCollection services)
{
// Database contexts
services.AddDbContext<ExchangeDbContext>(options =>
options.UseMySql(Configuration.GetConnectionString("ExchangeDb"),
new MySqlServerVersion(new Version(8, 0, 21))));
services.AddDbContext<IdentityDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("IdentityDb")));
// Providers
services.AddSufficitEFData();
}
Migration Setup
// In Program.cs
using Microsoft.EntityFrameworkCore;
var app = builder.Build();
// Apply migrations
using (var scope = app.Services.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<ExchangeDbContext>();
await dbContext.Database.MigrateAsync();
}
π» Development
Project Structure
Sufficit.EFData/
βββ src/
β βββ EFProvider.cs # Base provider class
β βββ ScopedProvider.cs # Scoped service management
β βββ DEFAULT.cs # Constants and utilities
β βββ Exchange/ # Exchange domain providers
β βββ Identity/ # Identity domain providers
β βββ Telephony/ # Telephony domain providers
β βββ Contacts/ # Contacts domain providers
β βββ Finance/ # Finance domain providers
β βββ Extensions/ # Extension methods
βββ tests/ # Unit tests
βββ docs/ # Documentation
βββ migrations-tool/ # Migration utilities
Building the Project
# Restore dependencies
dotnet restore
# Build for all target frameworks
dotnet build --configuration Release
# Run tests
dotnet test
# Create NuGet package
dotnet pack --configuration Release
Testing
// Example unit test
[Fact]
public async Task GetByTitleAsync_ReturnsCorrectTemplate()
{
// Arrange
var options = new DbContextOptionsBuilder<ExchangeDbContext>()
.UseInMemoryDatabase(databaseName: "TestDb")
.Options;
using var context = new ExchangeDbContext(options);
var provider = new EFMessageTemplateProvider(context);
// Act
var result = await provider.GetByTitleAsync("Welcome Email");
// Assert
Assert.NotNull(result);
Assert.Equal("Welcome Email", result.Title);
}
π€ Contributing
We welcome contributions! Please follow these guidelines:
Development Setup
Fork the repository
Clone your fork
git clone https://github.com/yourusername/sufficit-efdata.git cd sufficit-efdataCreate a feature branch
git checkout -b feature/new-providerMake your changes
Add tests for new functionality
Ensure all tests pass
dotnet testSubmit a pull request
Code Standards
- Follow C# coding conventions
- Use meaningful variable and method names
- Add XML documentation comments
- Write unit tests for new features
- Ensure code coverage > 80%
Commit Messages
Use conventional commit format:
feat: add new email tracking provider
fix: resolve connection timeout issue
docs: update API documentation
test: add unit tests for message templates
π License
This project is licensed under the MIT License - see the LICENSE file for details.
Developed by Sufficit SoluΓ§Γ΅es em Tecnologia da InformaΓ§Γ£o
For more information, visit our GitHub repository or contact development@sufficit.com.br.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. 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. net9.0 is compatible. 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. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.Bcl.AsyncInterfaces (>= 9.0.15 && < 10.0.0)
- Microsoft.Data.SqlClient (>= 6.1.5)
- Microsoft.EntityFrameworkCore (>= 3.1.32 && < 4.0.0)
- Microsoft.EntityFrameworkCore.SqlServer (>= 3.1.32 && < 4.0.0)
- Microsoft.Extensions.Caching.Abstractions (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Caching.Memory (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Configuration (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.DependencyInjection (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Identity.Stores (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Logging (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Logging.Configuration (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Options (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Primitives (>= 9.0.15 && < 10.0.0)
- Pomelo.EntityFrameworkCore.MySql (>= 3.2.7 && < 4.0.0)
- Sufficit.Asterisk.Utils (>= 1.26.327.2020)
- Sufficit.Base (>= 1.26.430.1424)
- Sufficit.Json (>= 1.26.327.2021)
- Sufficit.Utils (>= 1.26.416.417)
- System.ComponentModel.Annotations (>= 5.0.0)
- System.IO.Pipelines (>= 9.0.15 && < 10.0.0)
- System.Linq.Async (>= 6.0.3 && < 7.0.0)
- System.Linq.Async.Queryable (>= 6.0.3 && < 7.0.0)
- System.Text.Json (>= 9.0.15 && < 10.0.0)
-
net6.0
- Microsoft.Bcl.AsyncInterfaces (>= 8.0.0 && < 9.0.0)
- Microsoft.Data.SqlClient (>= 5.2.3)
- Microsoft.EntityFrameworkCore (>= 6.0.36 && < 7.0.0)
- Microsoft.EntityFrameworkCore.SqlServer (>= 6.0.36 && < 7.0.0)
- Microsoft.Extensions.Caching.Abstractions (>= 6.0.1 && < 7.0.0)
- Microsoft.Extensions.Caching.Memory (>= 6.0.3 && < 7.0.0)
- Microsoft.Extensions.Configuration (>= 6.0.2 && < 7.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 6.0.1 && < 7.0.0)
- Microsoft.Extensions.DependencyInjection (>= 6.0.2 && < 7.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 6.0.0 && < 7.0.0)
- Microsoft.Extensions.Identity.Stores (>= 6.0.36 && < 7.0.0)
- Microsoft.Extensions.Logging (>= 6.0.1 && < 7.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 6.0.4 && < 7.0.0)
- Microsoft.Extensions.Logging.Configuration (>= 6.0.1 && < 7.0.0)
- Microsoft.Extensions.Options (>= 6.0.1 && < 7.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 6.0.1 && < 7.0.0)
- Microsoft.Extensions.Primitives (>= 6.0.1 && < 7.0.0)
- Pomelo.EntityFrameworkCore.MySql (>= 6.0.3 && < 7.0.0)
- Sufficit.Asterisk.Utils (>= 1.26.327.2020)
- Sufficit.Base (>= 1.26.430.1424)
- Sufficit.Json (>= 1.26.327.2021)
- Sufficit.Utils (>= 1.26.416.417)
- System.ComponentModel.Annotations (>= 5.0.0)
- System.IO.Pipelines (>= 8.0.0 && < 10.0.0)
- System.Linq.Async (>= 6.0.3 && < 7.0.0)
- System.Linq.Async.Queryable (>= 6.0.3 && < 7.0.0)
- System.Text.Json (>= 8.0.5 && < 9.0.0)
-
net7.0
- Microsoft.Bcl.AsyncInterfaces (>= 8.0.0 && < 9.0.0)
- Microsoft.Data.SqlClient (>= 5.2.3)
- Microsoft.EntityFrameworkCore (>= 7.0.20 && < 8.0.0)
- Microsoft.EntityFrameworkCore.SqlServer (>= 7.0.20 && < 8.0.0)
- Microsoft.Extensions.Caching.Abstractions (>= 7.0.0 && < 8.0.0)
- Microsoft.Extensions.Caching.Memory (>= 7.0.0 && < 8.0.0)
- Microsoft.Extensions.Configuration (>= 7.0.0 && < 8.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 7.0.0 && < 8.0.0)
- Microsoft.Extensions.DependencyInjection (>= 7.0.0 && < 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 7.0.0 && < 8.0.0)
- Microsoft.Extensions.Identity.Stores (>= 7.0.20 && < 8.0.0)
- Microsoft.Extensions.Logging (>= 7.0.0 && < 8.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 7.0.1 && < 8.0.0)
- Microsoft.Extensions.Logging.Configuration (>= 7.0.0 && < 8.0.0)
- Microsoft.Extensions.Options (>= 7.0.1 && < 8.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 7.0.0 && < 8.0.0)
- Microsoft.Extensions.Primitives (>= 7.0.0 && < 8.0.0)
- Pomelo.EntityFrameworkCore.MySql (>= 7.0.0 && < 8.0.0)
- Sufficit.Asterisk.Utils (>= 1.26.327.2020)
- Sufficit.Base (>= 1.26.430.1424)
- Sufficit.Json (>= 1.26.327.2021)
- Sufficit.Utils (>= 1.26.416.417)
- System.ComponentModel.Annotations (>= 5.0.0)
- System.IO.Pipelines (>= 8.0.0 && < 10.0.0)
- System.Linq.Async (>= 6.0.3 && < 7.0.0)
- System.Linq.Async.Queryable (>= 6.0.3 && < 7.0.0)
- System.Text.Json (>= 8.0.5 && < 9.0.0)
-
net9.0
- Microsoft.Bcl.AsyncInterfaces (>= 9.0.15 && < 10.0.0)
- Microsoft.Data.SqlClient (>= 6.1.5)
- Microsoft.EntityFrameworkCore (>= 9.0.15 && < 10.0.0)
- Microsoft.EntityFrameworkCore.SqlServer (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Caching.Abstractions (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Caching.Memory (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Configuration (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.DependencyInjection (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Identity.Stores (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Logging (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Logging.Configuration (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Options (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 9.0.15 && < 10.0.0)
- Microsoft.Extensions.Primitives (>= 9.0.15 && < 10.0.0)
- Pomelo.EntityFrameworkCore.MySql (>= 9.0.0 && < 10.0.0)
- Sufficit.Asterisk.Utils (>= 1.26.327.2020)
- Sufficit.Base (>= 1.26.430.1424)
- Sufficit.Json (>= 1.26.327.2021)
- Sufficit.Utils (>= 1.26.416.417)
- System.ComponentModel.Annotations (>= 5.0.0)
- System.IO.Pipelines (>= 9.0.15 && < 10.0.0)
- System.Linq.Async (>= 6.0.3 && < 7.0.0)
- System.Linq.Async.Queryable (>= 6.0.3 && < 7.0.0)
- System.Text.Json (>= 9.0.15 && < 10.0.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Sufficit.EFData:
| Package | Downloads |
|---|---|
|
Sufficit.Communication
Package Description |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.26.430.2043 | 26 | 4/30/2026 |
| 1.26.415.353 | 108 | 4/15/2026 |
| 1.26.402.1343 | 156 | 4/2/2026 |
| 1.26.331.1955 | 100 | 3/31/2026 |
| 1.26.330.1254 | 114 | 3/30/2026 |
| 1.26.327.2021 | 101 | 3/27/2026 |
| 1.26.325.1643 | 143 | 3/25/2026 |
| 1.26.324.255 | 94 | 3/24/2026 |
| 1.26.319.1856 | 142 | 3/19/2026 |
| 1.26.313.1917 | 224 | 3/13/2026 |
| 1.26.306.1250 | 104 | 3/6/2026 |
| 1.26.304.2055 | 102 | 3/4/2026 |
| 1.26.302.1922 | 105 | 3/2/2026 |
| 1.26.227.150 | 109 | 2/27/2026 |
| 1.26.215.2041 | 180 | 2/15/2026 |
| 1.26.212.415 | 160 | 2/12/2026 |
| 1.26.210.1949 | 121 | 2/10/2026 |
| 1.26.108.1848 | 298 | 1/8/2026 |
| 1.25.919.2019 | 379 | 9/19/2025 |
| 1.25.917.252 | 375 | 9/17/2025 |