Update to latest version and show additional features

This commit is contained in:
2026-07-29 13:25:23 +02:00
parent 25690690d0
commit e44f2e7380
20 changed files with 804 additions and 31 deletions
@@ -0,0 +1,64 @@
using GerstITS.Data.EntityFramework;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
namespace GerstITS.Examples.Transactions.Migrations;
/// <summary>
/// Configures <see cref="ProductDbContext" /> to use a self-contained SQLite in-memory database.
///
/// SQLite is a RELATIONAL provider and therefore supports real ACID transactions, which is what the
/// transaction example needs to show an atomic rollback that actually discards partial work.
///
/// The EF Core InMemory provider (<c>UseInMemoryDatabase</c>) is deliberately NOT used here: it does
/// not support transactions at all - <c>Database.BeginTransaction()</c> raises the
/// <c>TransactionIgnoredWarning</c> - so it cannot demonstrate an atomic rollback. In production the
/// same code runs unchanged against PostgreSQL or SQL Server.
///
/// A single <see cref="SqliteConnection" /> is opened and kept open for the lifetime of the process so
/// the in-memory database is shared across every <see cref="ProductDbContext" /> instance (an in-memory
/// SQLite database only lives as long as its connection is open).
/// </summary>
public sealed class SqliteInMemoryDatabaseConfigurator : DatabaseConfiguratorBase, IDisposable
{
#region Fields
private readonly SqliteConnection _connection;
#endregion
#region Constructors
public SqliteInMemoryDatabaseConfigurator(IConfiguration configuration)
: base(configuration)
{
_connection = new SqliteConnection("DataSource=:memory:");
_connection.Open();
}
#endregion
#region DatabaseConfiguratorBase
public override void ConfigureModelCreating(ModelBuilder modelBuilder)
{
// No relational-specific mapping is required; ProductEntity is mapped by convention.
}
protected override void ConfigureDatabase(DbContextOptionsBuilder optionsBuilder, string connectionString)
{
optionsBuilder.UseSqlite(_connection);
}
#endregion
#region IDisposable
public void Dispose()
{
_connection.Dispose();
}
#endregion
}