Latest commit

History

145 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Build, Test and Analyze .NETpages-build-deploymentQodana

Quality Gate StatusCoverageBuy Me A Coffee

PackageVersionDownloads
Ploch.Data.Modelversiondownloads
Ploch.Data.GenericRepositoryversiondownloads
Ploch.Data.GenericRepository.EFCoreversiondownloads
Ploch.Data.EFCoreversiondownloads

Ploch.Data Libraries

A set of .NET libraries for building data access layers using standardised entity models, the Generic Repository and Unit of Work patterns, and Entity Framework Core.

Support the Project

If Ploch.Data saves you time or makes your projects nicer, please consider supporting its development. Every coffee directly funds time spent on maintenance, bug fixes, and new features.

Buy Me A Coffee — krisploch

Thank you for keeping open-source maintainers caffeinated.

Quick Start

// 1. Define entities using Ploch.Data.Model interfacespublicclassProduct:IHasId<int>,IHasTitle,IHasDescription,IHasAuditTimeProperties{publicintId{get;set;}publicstringTitle{get;set;}=null!;publicstring?Description{get;set;}publicDateTimeOffset?CreatedTime{get;set;}publicDateTimeOffset?ModifiedTime{get;set;}publicDateTimeOffset?AccessedTime{get;set;}}// 2. Register in DI (reference Ploch.Data.GenericRepository.EFCore.SqLite// or Ploch.Data.GenericRepository.EFCore.SqlServer — same code for both)usingPloch.Data.GenericRepository.EFCore.DependencyInjection;builder.Services.AddDbContextWithRepositories<MyDbContext>();// 3. Inject and use repositoriespublicclassProductService(IReadWriteRepositoryAsync<Product,int>repository){publicTask<Product?>GetAsync(intid)=>repository.GetByIdAsync(id);publicTask<IList<Product>>SearchAsync(stringterm)=>repository.GetAllAsync(p =>p.Title.Contains(term));}

Documentation

Full documentation is available in the docs/ folder:

Sample Application

A fully working Sample Application demonstrates entity modelling, repository operations, Unit of Work, pagination, eager loading, and integration testing.

Packages

Core

PackageDescription
Ploch.Data.ModelStandardised entity interfaces (IHasId, INamed, IHasTitle, IHasAuditProperties, etc.) and common base types (Category, Tag, Property)

Entity Framework Core

PackageDescription
Ploch.Data.EFCoreDesign-time factory base classes, IDbContextConfigurator, data seeding, value converters
Ploch.Data.EFCore.SqLiteSQLite provider: factory, configurator, DateTimeOffset workaround
Ploch.Data.EFCore.SqlServerSQL Server provider: factory, configurator

Generic Repository

PackageDescription
Ploch.Data.GenericRepositoryProvider-agnostic repository and Unit of Work interfaces
Ploch.Data.GenericRepository.EFCoreEF Core implementations, DI registration via AddRepositories<TDbContext>()
Ploch.Data.GenericRepository.EFCore.SqLiteOne-call DI registration for SQLite (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SqlServerOne-call DI registration for SQL Server (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SpecificationArdalis.Specification integration

Testing

PackageDescription
Ploch.Data.EFCore.IntegrationTestingDataIntegrationTest<TDbContext> base class for EF Core tests
Ploch.Data.GenericRepository.EFCore.IntegrationTestingGenericRepositoryDataIntegrationTest<TDbContext> with repository/UoW helpers

Utilities

PackageDescription
Ploch.Data.UtilitiesVarious utility types for working with data
Ploch.Data.StandardDataSetsCommon datasets (country lists, regions, etc.)

Features

A set of interfaces and base types for standardising entity models:

  • Core interfaces: IHasId<TId>, INamed, IHasTitle, IHasDescription, IHasContents, IHasNotes, IHasValue<TValue>
  • Audit interfaces: IHasAuditProperties, IHasAuditTimeProperties (and individual timestamp/user interfaces)
  • Hierarchical interfaces: IHierarchicalParentChildrenComposite<T> for tree structures
  • Categorisation: IHasCategories<TCategory>, IHasTags<TTag>
  • Common types: Category<T>, Tag, Property<TValue>, StringProperty, IntProperty, Image

A generic repository and unit of work pattern implementation for Entity Framework Core:

  • Layered repository interfaces: IQueryableRepository, IReadRepositoryAsync, IReadWriteRepositoryAsync
  • Unit of Work: IUnitOfWork with CommitAsync() and RollbackAsync()
  • One-line DI registration: services.AddDbContextWithRepositories<MyDbContext>() (provider-specific) or services.AddRepositories<MyDbContext>() (manual)
  • Zero-code database provider switching between SQLite and SQL Server
  • Pluggable IDbContextCreationLifecycle for provider-specific model configuration
  • Custom repository support with full interface registration
  • Specification pattern integration via Ardalis.Specification
  • Automatic audit property handling

Utility classes for EF Core including design-time DbContext factory base classes, runtime configurators for SQLite and SQL Server, and the SQLite DateTimeOffset workaround.

Base classes for integration tests using in-memory SQLite databases with automatic schema creation, repository helpers, and Unit of Work support.

Common data sets like country lists and regions.

Various utilities for working with data.

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

145 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Build, Test and Analyze .NETpages-build-deploymentQodana

Quality Gate StatusCoverageBuy Me A Coffee

PackageVersionDownloads
Ploch.Data.Modelversiondownloads
Ploch.Data.GenericRepositoryversiondownloads
Ploch.Data.GenericRepository.EFCoreversiondownloads
Ploch.Data.EFCoreversiondownloads

Ploch.Data Libraries

A set of .NET libraries for building data access layers using standardised entity models, the Generic Repository and Unit of Work patterns, and Entity Framework Core.

Support the Project

If Ploch.Data saves you time or makes your projects nicer, please consider supporting its development. Every coffee directly funds time spent on maintenance, bug fixes, and new features.

Buy Me A Coffee — krisploch

Thank you for keeping open-source maintainers caffeinated.

Quick Start

// 1. Define entities using Ploch.Data.Model interfacespublicclassProduct:IHasId<int>,IHasTitle,IHasDescription,IHasAuditTimeProperties{publicintId{get;set;}publicstringTitle{get;set;}=null!;publicstring?Description{get;set;}publicDateTimeOffset?CreatedTime{get;set;}publicDateTimeOffset?ModifiedTime{get;set;}publicDateTimeOffset?AccessedTime{get;set;}}// 2. Register in DI (reference Ploch.Data.GenericRepository.EFCore.SqLite// or Ploch.Data.GenericRepository.EFCore.SqlServer — same code for both)usingPloch.Data.GenericRepository.EFCore.DependencyInjection;builder.Services.AddDbContextWithRepositories<MyDbContext>();// 3. Inject and use repositoriespublicclassProductService(IReadWriteRepositoryAsync<Product,int>repository){publicTask<Product?>GetAsync(intid)=>repository.GetByIdAsync(id);publicTask<IList<Product>>SearchAsync(stringterm)=>repository.GetAllAsync(p =>p.Title.Contains(term));}

Documentation

Full documentation is available in the docs/ folder:

Sample Application

A fully working Sample Application demonstrates entity modelling, repository operations, Unit of Work, pagination, eager loading, and integration testing.

Packages

Core

PackageDescription
Ploch.Data.ModelStandardised entity interfaces (IHasId, INamed, IHasTitle, IHasAuditProperties, etc.) and common base types (Category, Tag, Property)

Entity Framework Core

PackageDescription
Ploch.Data.EFCoreDesign-time factory base classes, IDbContextConfigurator, data seeding, value converters
Ploch.Data.EFCore.SqLiteSQLite provider: factory, configurator, DateTimeOffset workaround
Ploch.Data.EFCore.SqlServerSQL Server provider: factory, configurator

Generic Repository

PackageDescription
Ploch.Data.GenericRepositoryProvider-agnostic repository and Unit of Work interfaces
Ploch.Data.GenericRepository.EFCoreEF Core implementations, DI registration via AddRepositories<TDbContext>()
Ploch.Data.GenericRepository.EFCore.SqLiteOne-call DI registration for SQLite (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SqlServerOne-call DI registration for SQL Server (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SpecificationArdalis.Specification integration

Testing

PackageDescription
Ploch.Data.EFCore.IntegrationTestingDataIntegrationTest<TDbContext> base class for EF Core tests
Ploch.Data.GenericRepository.EFCore.IntegrationTestingGenericRepositoryDataIntegrationTest<TDbContext> with repository/UoW helpers

Utilities

PackageDescription
Ploch.Data.UtilitiesVarious utility types for working with data
Ploch.Data.StandardDataSetsCommon datasets (country lists, regions, etc.)

Features

A set of interfaces and base types for standardising entity models:

  • Core interfaces: IHasId<TId>, INamed, IHasTitle, IHasDescription, IHasContents, IHasNotes, IHasValue<TValue>
  • Audit interfaces: IHasAuditProperties, IHasAuditTimeProperties (and individual timestamp/user interfaces)
  • Hierarchical interfaces: IHierarchicalParentChildrenComposite<T> for tree structures
  • Categorisation: IHasCategories<TCategory>, IHasTags<TTag>
  • Common types: Category<T>, Tag, Property<TValue>, StringProperty, IntProperty, Image

A generic repository and unit of work pattern implementation for Entity Framework Core:

  • Layered repository interfaces: IQueryableRepository, IReadRepositoryAsync, IReadWriteRepositoryAsync
  • Unit of Work: IUnitOfWork with CommitAsync() and RollbackAsync()
  • One-line DI registration: services.AddDbContextWithRepositories<MyDbContext>() (provider-specific) or services.AddRepositories<MyDbContext>() (manual)
  • Zero-code database provider switching between SQLite and SQL Server
  • Pluggable IDbContextCreationLifecycle for provider-specific model configuration
  • Custom repository support with full interface registration
  • Specification pattern integration via Ardalis.Specification
  • Automatic audit property handling

Utility classes for EF Core including design-time DbContext factory base classes, runtime configurators for SQLite and SQL Server, and the SQLite DateTimeOffset workaround.

Base classes for integration tests using in-memory SQLite databases with automatic schema creation, repository helpers, and Unit of Work support.

Common data sets like country lists and regions.

Various utilities for working with data.

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

145 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Build, Test and Analyze .NETpages-build-deploymentQodana

Quality Gate StatusCoverageBuy Me A Coffee

PackageVersionDownloads
Ploch.Data.Modelversiondownloads
Ploch.Data.GenericRepositoryversiondownloads
Ploch.Data.GenericRepository.EFCoreversiondownloads
Ploch.Data.EFCoreversiondownloads

Ploch.Data Libraries

A set of .NET libraries for building data access layers using standardised entity models, the Generic Repository and Unit of Work patterns, and Entity Framework Core.

Support the Project

If Ploch.Data saves you time or makes your projects nicer, please consider supporting its development. Every coffee directly funds time spent on maintenance, bug fixes, and new features.

Buy Me A Coffee — krisploch

Thank you for keeping open-source maintainers caffeinated.

Quick Start

// 1. Define entities using Ploch.Data.Model interfacespublicclassProduct:IHasId<int>,IHasTitle,IHasDescription,IHasAuditTimeProperties{publicintId{get;set;}publicstringTitle{get;set;}=null!;publicstring?Description{get;set;}publicDateTimeOffset?CreatedTime{get;set;}publicDateTimeOffset?ModifiedTime{get;set;}publicDateTimeOffset?AccessedTime{get;set;}}// 2. Register in DI (reference Ploch.Data.GenericRepository.EFCore.SqLite// or Ploch.Data.GenericRepository.EFCore.SqlServer — same code for both)usingPloch.Data.GenericRepository.EFCore.DependencyInjection;builder.Services.AddDbContextWithRepositories<MyDbContext>();// 3. Inject and use repositoriespublicclassProductService(IReadWriteRepositoryAsync<Product,int>repository){publicTask<Product?>GetAsync(intid)=>repository.GetByIdAsync(id);publicTask<IList<Product>>SearchAsync(stringterm)=>repository.GetAllAsync(p =>p.Title.Contains(term));}

Documentation

Full documentation is available in the docs/ folder:

Sample Application

A fully working Sample Application demonstrates entity modelling, repository operations, Unit of Work, pagination, eager loading, and integration testing.

Packages

Core

PackageDescription
Ploch.Data.ModelStandardised entity interfaces (IHasId, INamed, IHasTitle, IHasAuditProperties, etc.) and common base types (Category, Tag, Property)

Entity Framework Core

PackageDescription
Ploch.Data.EFCoreDesign-time factory base classes, IDbContextConfigurator, data seeding, value converters
Ploch.Data.EFCore.SqLiteSQLite provider: factory, configurator, DateTimeOffset workaround
Ploch.Data.EFCore.SqlServerSQL Server provider: factory, configurator

Generic Repository

PackageDescription
Ploch.Data.GenericRepositoryProvider-agnostic repository and Unit of Work interfaces
Ploch.Data.GenericRepository.EFCoreEF Core implementations, DI registration via AddRepositories<TDbContext>()
Ploch.Data.GenericRepository.EFCore.SqLiteOne-call DI registration for SQLite (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SqlServerOne-call DI registration for SQL Server (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SpecificationArdalis.Specification integration

Testing

PackageDescription
Ploch.Data.EFCore.IntegrationTestingDataIntegrationTest<TDbContext> base class for EF Core tests
Ploch.Data.GenericRepository.EFCore.IntegrationTestingGenericRepositoryDataIntegrationTest<TDbContext> with repository/UoW helpers

Utilities

PackageDescription
Ploch.Data.UtilitiesVarious utility types for working with data
Ploch.Data.StandardDataSetsCommon datasets (country lists, regions, etc.)

Features

A set of interfaces and base types for standardising entity models:

  • Core interfaces: IHasId<TId>, INamed, IHasTitle, IHasDescription, IHasContents, IHasNotes, IHasValue<TValue>
  • Audit interfaces: IHasAuditProperties, IHasAuditTimeProperties (and individual timestamp/user interfaces)
  • Hierarchical interfaces: IHierarchicalParentChildrenComposite<T> for tree structures
  • Categorisation: IHasCategories<TCategory>, IHasTags<TTag>
  • Common types: Category<T>, Tag, Property<TValue>, StringProperty, IntProperty, Image

A generic repository and unit of work pattern implementation for Entity Framework Core:

  • Layered repository interfaces: IQueryableRepository, IReadRepositoryAsync, IReadWriteRepositoryAsync
  • Unit of Work: IUnitOfWork with CommitAsync() and RollbackAsync()
  • One-line DI registration: services.AddDbContextWithRepositories<MyDbContext>() (provider-specific) or services.AddRepositories<MyDbContext>() (manual)
  • Zero-code database provider switching between SQLite and SQL Server
  • Pluggable IDbContextCreationLifecycle for provider-specific model configuration
  • Custom repository support with full interface registration
  • Specification pattern integration via Ardalis.Specification
  • Automatic audit property handling

Utility classes for EF Core including design-time DbContext factory base classes, runtime configurators for SQLite and SQL Server, and the SQLite DateTimeOffset workaround.

Base classes for integration tests using in-memory SQLite databases with automatic schema creation, repository helpers, and Unit of Work support.

Common data sets like country lists and regions.

Various utilities for working with data.

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

145 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Build, Test and Analyze .NETpages-build-deploymentQodana

Quality Gate StatusCoverageBuy Me A Coffee

PackageVersionDownloads
Ploch.Data.Modelversiondownloads
Ploch.Data.GenericRepositoryversiondownloads
Ploch.Data.GenericRepository.EFCoreversiondownloads
Ploch.Data.EFCoreversiondownloads

Ploch.Data Libraries

A set of .NET libraries for building data access layers using standardised entity models, the Generic Repository and Unit of Work patterns, and Entity Framework Core.

Support the Project

If Ploch.Data saves you time or makes your projects nicer, please consider supporting its development. Every coffee directly funds time spent on maintenance, bug fixes, and new features.

Buy Me A Coffee — krisploch

Thank you for keeping open-source maintainers caffeinated.

Quick Start

// 1. Define entities using Ploch.Data.Model interfacespublicclassProduct:IHasId<int>,IHasTitle,IHasDescription,IHasAuditTimeProperties{publicintId{get;set;}publicstringTitle{get;set;}=null!;publicstring?Description{get;set;}publicDateTimeOffset?CreatedTime{get;set;}publicDateTimeOffset?ModifiedTime{get;set;}publicDateTimeOffset?AccessedTime{get;set;}}// 2. Register in DI (reference Ploch.Data.GenericRepository.EFCore.SqLite// or Ploch.Data.GenericRepository.EFCore.SqlServer — same code for both)usingPloch.Data.GenericRepository.EFCore.DependencyInjection;builder.Services.AddDbContextWithRepositories<MyDbContext>();// 3. Inject and use repositoriespublicclassProductService(IReadWriteRepositoryAsync<Product,int>repository){publicTask<Product?>GetAsync(intid)=>repository.GetByIdAsync(id);publicTask<IList<Product>>SearchAsync(stringterm)=>repository.GetAllAsync(p =>p.Title.Contains(term));}

Documentation

Full documentation is available in the docs/ folder:

Sample Application

A fully working Sample Application demonstrates entity modelling, repository operations, Unit of Work, pagination, eager loading, and integration testing.

Packages

Core

PackageDescription
Ploch.Data.ModelStandardised entity interfaces (IHasId, INamed, IHasTitle, IHasAuditProperties, etc.) and common base types (Category, Tag, Property)

Entity Framework Core

PackageDescription
Ploch.Data.EFCoreDesign-time factory base classes, IDbContextConfigurator, data seeding, value converters
Ploch.Data.EFCore.SqLiteSQLite provider: factory, configurator, DateTimeOffset workaround
Ploch.Data.EFCore.SqlServerSQL Server provider: factory, configurator

Generic Repository

PackageDescription
Ploch.Data.GenericRepositoryProvider-agnostic repository and Unit of Work interfaces
Ploch.Data.GenericRepository.EFCoreEF Core implementations, DI registration via AddRepositories<TDbContext>()
Ploch.Data.GenericRepository.EFCore.SqLiteOne-call DI registration for SQLite (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SqlServerOne-call DI registration for SQL Server (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SpecificationArdalis.Specification integration

Testing

PackageDescription
Ploch.Data.EFCore.IntegrationTestingDataIntegrationTest<TDbContext> base class for EF Core tests
Ploch.Data.GenericRepository.EFCore.IntegrationTestingGenericRepositoryDataIntegrationTest<TDbContext> with repository/UoW helpers

Utilities

PackageDescription
Ploch.Data.UtilitiesVarious utility types for working with data
Ploch.Data.StandardDataSetsCommon datasets (country lists, regions, etc.)

Features

A set of interfaces and base types for standardising entity models:

  • Core interfaces: IHasId<TId>, INamed, IHasTitle, IHasDescription, IHasContents, IHasNotes, IHasValue<TValue>
  • Audit interfaces: IHasAuditProperties, IHasAuditTimeProperties (and individual timestamp/user interfaces)
  • Hierarchical interfaces: IHierarchicalParentChildrenComposite<T> for tree structures
  • Categorisation: IHasCategories<TCategory>, IHasTags<TTag>
  • Common types: Category<T>, Tag, Property<TValue>, StringProperty, IntProperty, Image

A generic repository and unit of work pattern implementation for Entity Framework Core:

  • Layered repository interfaces: IQueryableRepository, IReadRepositoryAsync, IReadWriteRepositoryAsync
  • Unit of Work: IUnitOfWork with CommitAsync() and RollbackAsync()
  • One-line DI registration: services.AddDbContextWithRepositories<MyDbContext>() (provider-specific) or services.AddRepositories<MyDbContext>() (manual)
  • Zero-code database provider switching between SQLite and SQL Server
  • Pluggable IDbContextCreationLifecycle for provider-specific model configuration
  • Custom repository support with full interface registration
  • Specification pattern integration via Ardalis.Specification
  • Automatic audit property handling

Utility classes for EF Core including design-time DbContext factory base classes, runtime configurators for SQLite and SQL Server, and the SQLite DateTimeOffset workaround.

Base classes for integration tests using in-memory SQLite databases with automatic schema creation, repository helpers, and Unit of Work support.

Common data sets like country lists and regions.

Various utilities for working with data.

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

145 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Build, Test and Analyze .NETpages-build-deploymentQodana

Quality Gate StatusCoverageBuy Me A Coffee

PackageVersionDownloads
Ploch.Data.Modelversiondownloads
Ploch.Data.GenericRepositoryversiondownloads
Ploch.Data.GenericRepository.EFCoreversiondownloads
Ploch.Data.EFCoreversiondownloads

Ploch.Data Libraries

A set of .NET libraries for building data access layers using standardised entity models, the Generic Repository and Unit of Work patterns, and Entity Framework Core.

Support the Project

If Ploch.Data saves you time or makes your projects nicer, please consider supporting its development. Every coffee directly funds time spent on maintenance, bug fixes, and new features.

Buy Me A Coffee — krisploch

Thank you for keeping open-source maintainers caffeinated.

Quick Start

// 1. Define entities using Ploch.Data.Model interfacespublicclassProduct:IHasId<int>,IHasTitle,IHasDescription,IHasAuditTimeProperties{publicintId{get;set;}publicstringTitle{get;set;}=null!;publicstring?Description{get;set;}publicDateTimeOffset?CreatedTime{get;set;}publicDateTimeOffset?ModifiedTime{get;set;}publicDateTimeOffset?AccessedTime{get;set;}}// 2. Register in DI (reference Ploch.Data.GenericRepository.EFCore.SqLite// or Ploch.Data.GenericRepository.EFCore.SqlServer — same code for both)usingPloch.Data.GenericRepository.EFCore.DependencyInjection;builder.Services.AddDbContextWithRepositories<MyDbContext>();// 3. Inject and use repositoriespublicclassProductService(IReadWriteRepositoryAsync<Product,int>repository){publicTask<Product?>GetAsync(intid)=>repository.GetByIdAsync(id);publicTask<IList<Product>>SearchAsync(stringterm)=>repository.GetAllAsync(p =>p.Title.Contains(term));}

Documentation

Full documentation is available in the docs/ folder:

Sample Application

A fully working Sample Application demonstrates entity modelling, repository operations, Unit of Work, pagination, eager loading, and integration testing.

Packages

Core

PackageDescription
Ploch.Data.ModelStandardised entity interfaces (IHasId, INamed, IHasTitle, IHasAuditProperties, etc.) and common base types (Category, Tag, Property)

Entity Framework Core

PackageDescription
Ploch.Data.EFCoreDesign-time factory base classes, IDbContextConfigurator, data seeding, value converters
Ploch.Data.EFCore.SqLiteSQLite provider: factory, configurator, DateTimeOffset workaround
Ploch.Data.EFCore.SqlServerSQL Server provider: factory, configurator

Generic Repository

PackageDescription
Ploch.Data.GenericRepositoryProvider-agnostic repository and Unit of Work interfaces
Ploch.Data.GenericRepository.EFCoreEF Core implementations, DI registration via AddRepositories<TDbContext>()
Ploch.Data.GenericRepository.EFCore.SqLiteOne-call DI registration for SQLite (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SqlServerOne-call DI registration for SQL Server (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SpecificationArdalis.Specification integration

Testing

PackageDescription
Ploch.Data.EFCore.IntegrationTestingDataIntegrationTest<TDbContext> base class for EF Core tests
Ploch.Data.GenericRepository.EFCore.IntegrationTestingGenericRepositoryDataIntegrationTest<TDbContext> with repository/UoW helpers

Utilities

PackageDescription
Ploch.Data.UtilitiesVarious utility types for working with data
Ploch.Data.StandardDataSetsCommon datasets (country lists, regions, etc.)

Features

A set of interfaces and base types for standardising entity models:

  • Core interfaces: IHasId<TId>, INamed, IHasTitle, IHasDescription, IHasContents, IHasNotes, IHasValue<TValue>
  • Audit interfaces: IHasAuditProperties, IHasAuditTimeProperties (and individual timestamp/user interfaces)
  • Hierarchical interfaces: IHierarchicalParentChildrenComposite<T> for tree structures
  • Categorisation: IHasCategories<TCategory>, IHasTags<TTag>
  • Common types: Category<T>, Tag, Property<TValue>, StringProperty, IntProperty, Image

A generic repository and unit of work pattern implementation for Entity Framework Core:

  • Layered repository interfaces: IQueryableRepository, IReadRepositoryAsync, IReadWriteRepositoryAsync
  • Unit of Work: IUnitOfWork with CommitAsync() and RollbackAsync()
  • One-line DI registration: services.AddDbContextWithRepositories<MyDbContext>() (provider-specific) or services.AddRepositories<MyDbContext>() (manual)
  • Zero-code database provider switching between SQLite and SQL Server
  • Pluggable IDbContextCreationLifecycle for provider-specific model configuration
  • Custom repository support with full interface registration
  • Specification pattern integration via Ardalis.Specification
  • Automatic audit property handling

Utility classes for EF Core including design-time DbContext factory base classes, runtime configurators for SQLite and SQL Server, and the SQLite DateTimeOffset workaround.

Base classes for integration tests using in-memory SQLite databases with automatic schema creation, repository helpers, and Unit of Work support.

Common data sets like country lists and regions.

Various utilities for working with data.

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

145 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Build, Test and Analyze .NETpages-build-deploymentQodana

Quality Gate StatusCoverageBuy Me A Coffee

PackageVersionDownloads
Ploch.Data.Modelversiondownloads
Ploch.Data.GenericRepositoryversiondownloads
Ploch.Data.GenericRepository.EFCoreversiondownloads
Ploch.Data.EFCoreversiondownloads

Ploch.Data Libraries

A set of .NET libraries for building data access layers using standardised entity models, the Generic Repository and Unit of Work patterns, and Entity Framework Core.

Support the Project

If Ploch.Data saves you time or makes your projects nicer, please consider supporting its development. Every coffee directly funds time spent on maintenance, bug fixes, and new features.

Buy Me A Coffee — krisploch

Thank you for keeping open-source maintainers caffeinated.

Quick Start

// 1. Define entities using Ploch.Data.Model interfacespublicclassProduct:IHasId<int>,IHasTitle,IHasDescription,IHasAuditTimeProperties{publicintId{get;set;}publicstringTitle{get;set;}=null!;publicstring?Description{get;set;}publicDateTimeOffset?CreatedTime{get;set;}publicDateTimeOffset?ModifiedTime{get;set;}publicDateTimeOffset?AccessedTime{get;set;}}// 2. Register in DI (reference Ploch.Data.GenericRepository.EFCore.SqLite// or Ploch.Data.GenericRepository.EFCore.SqlServer — same code for both)usingPloch.Data.GenericRepository.EFCore.DependencyInjection;builder.Services.AddDbContextWithRepositories<MyDbContext>();// 3. Inject and use repositoriespublicclassProductService(IReadWriteRepositoryAsync<Product,int>repository){publicTask<Product?>GetAsync(intid)=>repository.GetByIdAsync(id);publicTask<IList<Product>>SearchAsync(stringterm)=>repository.GetAllAsync(p =>p.Title.Contains(term));}

Documentation

Full documentation is available in the docs/ folder:

Sample Application

A fully working Sample Application demonstrates entity modelling, repository operations, Unit of Work, pagination, eager loading, and integration testing.

Packages

Core

PackageDescription
Ploch.Data.ModelStandardised entity interfaces (IHasId, INamed, IHasTitle, IHasAuditProperties, etc.) and common base types (Category, Tag, Property)

Entity Framework Core

PackageDescription
Ploch.Data.EFCoreDesign-time factory base classes, IDbContextConfigurator, data seeding, value converters
Ploch.Data.EFCore.SqLiteSQLite provider: factory, configurator, DateTimeOffset workaround
Ploch.Data.EFCore.SqlServerSQL Server provider: factory, configurator

Generic Repository

PackageDescription
Ploch.Data.GenericRepositoryProvider-agnostic repository and Unit of Work interfaces
Ploch.Data.GenericRepository.EFCoreEF Core implementations, DI registration via AddRepositories<TDbContext>()
Ploch.Data.GenericRepository.EFCore.SqLiteOne-call DI registration for SQLite (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SqlServerOne-call DI registration for SQL Server (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SpecificationArdalis.Specification integration

Testing

PackageDescription
Ploch.Data.EFCore.IntegrationTestingDataIntegrationTest<TDbContext> base class for EF Core tests
Ploch.Data.GenericRepository.EFCore.IntegrationTestingGenericRepositoryDataIntegrationTest<TDbContext> with repository/UoW helpers

Utilities

PackageDescription
Ploch.Data.UtilitiesVarious utility types for working with data
Ploch.Data.StandardDataSetsCommon datasets (country lists, regions, etc.)

Features

A set of interfaces and base types for standardising entity models:

  • Core interfaces: IHasId<TId>, INamed, IHasTitle, IHasDescription, IHasContents, IHasNotes, IHasValue<TValue>
  • Audit interfaces: IHasAuditProperties, IHasAuditTimeProperties (and individual timestamp/user interfaces)
  • Hierarchical interfaces: IHierarchicalParentChildrenComposite<T> for tree structures
  • Categorisation: IHasCategories<TCategory>, IHasTags<TTag>
  • Common types: Category<T>, Tag, Property<TValue>, StringProperty, IntProperty, Image

A generic repository and unit of work pattern implementation for Entity Framework Core:

  • Layered repository interfaces: IQueryableRepository, IReadRepositoryAsync, IReadWriteRepositoryAsync
  • Unit of Work: IUnitOfWork with CommitAsync() and RollbackAsync()
  • One-line DI registration: services.AddDbContextWithRepositories<MyDbContext>() (provider-specific) or services.AddRepositories<MyDbContext>() (manual)
  • Zero-code database provider switching between SQLite and SQL Server
  • Pluggable IDbContextCreationLifecycle for provider-specific model configuration
  • Custom repository support with full interface registration
  • Specification pattern integration via Ardalis.Specification
  • Automatic audit property handling

Utility classes for EF Core including design-time DbContext factory base classes, runtime configurators for SQLite and SQL Server, and the SQLite DateTimeOffset workaround.

Base classes for integration tests using in-memory SQLite databases with automatic schema creation, repository helpers, and Unit of Work support.

Common data sets like country lists and regions.

Various utilities for working with data.

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

145 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Build, Test and Analyze .NETpages-build-deploymentQodana

Quality Gate StatusCoverageBuy Me A Coffee

PackageVersionDownloads
Ploch.Data.Modelversiondownloads
Ploch.Data.GenericRepositoryversiondownloads
Ploch.Data.GenericRepository.EFCoreversiondownloads
Ploch.Data.EFCoreversiondownloads

Ploch.Data Libraries

A set of .NET libraries for building data access layers using standardised entity models, the Generic Repository and Unit of Work patterns, and Entity Framework Core.

Support the Project

If Ploch.Data saves you time or makes your projects nicer, please consider supporting its development. Every coffee directly funds time spent on maintenance, bug fixes, and new features.

Buy Me A Coffee — krisploch

Thank you for keeping open-source maintainers caffeinated.

Quick Start

// 1. Define entities using Ploch.Data.Model interfacespublicclassProduct:IHasId<int>,IHasTitle,IHasDescription,IHasAuditTimeProperties{publicintId{get;set;}publicstringTitle{get;set;}=null!;publicstring?Description{get;set;}publicDateTimeOffset?CreatedTime{get;set;}publicDateTimeOffset?ModifiedTime{get;set;}publicDateTimeOffset?AccessedTime{get;set;}}// 2. Register in DI (reference Ploch.Data.GenericRepository.EFCore.SqLite// or Ploch.Data.GenericRepository.EFCore.SqlServer — same code for both)usingPloch.Data.GenericRepository.EFCore.DependencyInjection;builder.Services.AddDbContextWithRepositories<MyDbContext>();// 3. Inject and use repositoriespublicclassProductService(IReadWriteRepositoryAsync<Product,int>repository){publicTask<Product?>GetAsync(intid)=>repository.GetByIdAsync(id);publicTask<IList<Product>>SearchAsync(stringterm)=>repository.GetAllAsync(p =>p.Title.Contains(term));}

Documentation

Full documentation is available in the docs/ folder:

Sample Application

A fully working Sample Application demonstrates entity modelling, repository operations, Unit of Work, pagination, eager loading, and integration testing.

Packages

Core

PackageDescription
Ploch.Data.ModelStandardised entity interfaces (IHasId, INamed, IHasTitle, IHasAuditProperties, etc.) and common base types (Category, Tag, Property)

Entity Framework Core

PackageDescription
Ploch.Data.EFCoreDesign-time factory base classes, IDbContextConfigurator, data seeding, value converters
Ploch.Data.EFCore.SqLiteSQLite provider: factory, configurator, DateTimeOffset workaround
Ploch.Data.EFCore.SqlServerSQL Server provider: factory, configurator

Generic Repository

PackageDescription
Ploch.Data.GenericRepositoryProvider-agnostic repository and Unit of Work interfaces
Ploch.Data.GenericRepository.EFCoreEF Core implementations, DI registration via AddRepositories<TDbContext>()
Ploch.Data.GenericRepository.EFCore.SqLiteOne-call DI registration for SQLite (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SqlServerOne-call DI registration for SQL Server (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SpecificationArdalis.Specification integration

Testing

PackageDescription
Ploch.Data.EFCore.IntegrationTestingDataIntegrationTest<TDbContext> base class for EF Core tests
Ploch.Data.GenericRepository.EFCore.IntegrationTestingGenericRepositoryDataIntegrationTest<TDbContext> with repository/UoW helpers

Utilities

PackageDescription
Ploch.Data.UtilitiesVarious utility types for working with data
Ploch.Data.StandardDataSetsCommon datasets (country lists, regions, etc.)

Features

A set of interfaces and base types for standardising entity models:

  • Core interfaces: IHasId<TId>, INamed, IHasTitle, IHasDescription, IHasContents, IHasNotes, IHasValue<TValue>
  • Audit interfaces: IHasAuditProperties, IHasAuditTimeProperties (and individual timestamp/user interfaces)
  • Hierarchical interfaces: IHierarchicalParentChildrenComposite<T> for tree structures
  • Categorisation: IHasCategories<TCategory>, IHasTags<TTag>
  • Common types: Category<T>, Tag, Property<TValue>, StringProperty, IntProperty, Image

A generic repository and unit of work pattern implementation for Entity Framework Core:

  • Layered repository interfaces: IQueryableRepository, IReadRepositoryAsync, IReadWriteRepositoryAsync
  • Unit of Work: IUnitOfWork with CommitAsync() and RollbackAsync()
  • One-line DI registration: services.AddDbContextWithRepositories<MyDbContext>() (provider-specific) or services.AddRepositories<MyDbContext>() (manual)
  • Zero-code database provider switching between SQLite and SQL Server
  • Pluggable IDbContextCreationLifecycle for provider-specific model configuration
  • Custom repository support with full interface registration
  • Specification pattern integration via Ardalis.Specification
  • Automatic audit property handling

Utility classes for EF Core including design-time DbContext factory base classes, runtime configurators for SQLite and SQL Server, and the SQLite DateTimeOffset workaround.

Base classes for integration tests using in-memory SQLite databases with automatic schema creation, repository helpers, and Unit of Work support.

Common data sets like country lists and regions.

Various utilities for working with data.

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

145 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Build, Test and Analyze .NETpages-build-deploymentQodana

Quality Gate StatusCoverageBuy Me A Coffee

PackageVersionDownloads
Ploch.Data.Modelversiondownloads
Ploch.Data.GenericRepositoryversiondownloads
Ploch.Data.GenericRepository.EFCoreversiondownloads
Ploch.Data.EFCoreversiondownloads

Ploch.Data Libraries

A set of .NET libraries for building data access layers using standardised entity models, the Generic Repository and Unit of Work patterns, and Entity Framework Core.

Support the Project

If Ploch.Data saves you time or makes your projects nicer, please consider supporting its development. Every coffee directly funds time spent on maintenance, bug fixes, and new features.

Buy Me A Coffee — krisploch

Thank you for keeping open-source maintainers caffeinated.

Quick Start

// 1. Define entities using Ploch.Data.Model interfacespublicclassProduct:IHasId<int>,IHasTitle,IHasDescription,IHasAuditTimeProperties{publicintId{get;set;}publicstringTitle{get;set;}=null!;publicstring?Description{get;set;}publicDateTimeOffset?CreatedTime{get;set;}publicDateTimeOffset?ModifiedTime{get;set;}publicDateTimeOffset?AccessedTime{get;set;}}// 2. Register in DI (reference Ploch.Data.GenericRepository.EFCore.SqLite// or Ploch.Data.GenericRepository.EFCore.SqlServer — same code for both)usingPloch.Data.GenericRepository.EFCore.DependencyInjection;builder.Services.AddDbContextWithRepositories<MyDbContext>();// 3. Inject and use repositoriespublicclassProductService(IReadWriteRepositoryAsync<Product,int>repository){publicTask<Product?>GetAsync(intid)=>repository.GetByIdAsync(id);publicTask<IList<Product>>SearchAsync(stringterm)=>repository.GetAllAsync(p =>p.Title.Contains(term));}

Documentation

Full documentation is available in the docs/ folder:

Sample Application

A fully working Sample Application demonstrates entity modelling, repository operations, Unit of Work, pagination, eager loading, and integration testing.

Packages

Core

PackageDescription
Ploch.Data.ModelStandardised entity interfaces (IHasId, INamed, IHasTitle, IHasAuditProperties, etc.) and common base types (Category, Tag, Property)

Entity Framework Core

PackageDescription
Ploch.Data.EFCoreDesign-time factory base classes, IDbContextConfigurator, data seeding, value converters
Ploch.Data.EFCore.SqLiteSQLite provider: factory, configurator, DateTimeOffset workaround
Ploch.Data.EFCore.SqlServerSQL Server provider: factory, configurator

Generic Repository

PackageDescription
Ploch.Data.GenericRepositoryProvider-agnostic repository and Unit of Work interfaces
Ploch.Data.GenericRepository.EFCoreEF Core implementations, DI registration via AddRepositories<TDbContext>()
Ploch.Data.GenericRepository.EFCore.SqLiteOne-call DI registration for SQLite (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SqlServerOne-call DI registration for SQL Server (AddDbContextWithRepositories<TDbContext>())
Ploch.Data.GenericRepository.EFCore.SpecificationArdalis.Specification integration

Testing

PackageDescription
Ploch.Data.EFCore.IntegrationTestingDataIntegrationTest<TDbContext> base class for EF Core tests
Ploch.Data.GenericRepository.EFCore.IntegrationTestingGenericRepositoryDataIntegrationTest<TDbContext> with repository/UoW helpers

Utilities

PackageDescription
Ploch.Data.UtilitiesVarious utility types for working with data
Ploch.Data.StandardDataSetsCommon datasets (country lists, regions, etc.)

Features

A set of interfaces and base types for standardising entity models:

  • Core interfaces: IHasId<TId>, INamed, IHasTitle, IHasDescription, IHasContents, IHasNotes, IHasValue<TValue>
  • Audit interfaces: IHasAuditProperties, IHasAuditTimeProperties (and individual timestamp/user interfaces)
  • Hierarchical interfaces: IHierarchicalParentChildrenComposite<T> for tree structures
  • Categorisation: IHasCategories<TCategory>, IHasTags<TTag>
  • Common types: Category<T>, Tag, Property<TValue>, StringProperty, IntProperty, Image

A generic repository and unit of work pattern implementation for Entity Framework Core:

  • Layered repository interfaces: IQueryableRepository, IReadRepositoryAsync, IReadWriteRepositoryAsync
  • Unit of Work: IUnitOfWork with CommitAsync() and RollbackAsync()
  • One-line DI registration: services.AddDbContextWithRepositories<MyDbContext>() (provider-specific) or services.AddRepositories<MyDbContext>() (manual)
  • Zero-code database provider switching between SQLite and SQL Server
  • Pluggable IDbContextCreationLifecycle for provider-specific model configuration
  • Custom repository support with full interface registration
  • Specification pattern integration via Ardalis.Specification
  • Automatic audit property handling

Utility classes for EF Core including design-time DbContext factory base classes, runtime configurators for SQLite and SQL Server, and the SQLite DateTimeOffset workaround.

Base classes for integration tests using in-memory SQLite databases with automatic schema creation, repository helpers, and Unit of Work support.

Common data sets like country lists and regions.

Various utilities for working with data.

Releases

Sponsor this project

Packages

Used by

Contributors

Languages