diff --git a/AMWD.Common.EntityFrameworkCore/Extensions/DatabaseFacadeExtensions.cs b/AMWD.Common.EntityFrameworkCore/Extensions/DatabaseFacadeExtensions.cs
index 184c247..c41c2fa 100644
--- a/AMWD.Common.EntityFrameworkCore/Extensions/DatabaseFacadeExtensions.cs
+++ b/AMWD.Common.EntityFrameworkCore/Extensions/DatabaseFacadeExtensions.cs
@@ -114,7 +114,7 @@ namespace Microsoft.EntityFrameworkCore
}
}
- private static DatabaseProvider GetProviderType(this DatabaseFacade database)
+ internal static DatabaseProvider GetProviderType(this DatabaseFacade database)
=> GetProviderType(database.ProviderName);
private static DatabaseProvider GetProviderType(this DbConnection connection)
@@ -342,7 +342,7 @@ END;"
}
}
- private enum DatabaseProvider
+ internal enum DatabaseProvider
{
MySQL = 1,
Oracle = 2,
diff --git a/AMWD.Common.EntityFrameworkCore/Extensions/DbContextExensions.cs b/AMWD.Common.EntityFrameworkCore/Extensions/DbContextExensions.cs
new file mode 100644
index 0000000..d24fd71
--- /dev/null
+++ b/AMWD.Common.EntityFrameworkCore/Extensions/DbContextExensions.cs
@@ -0,0 +1,91 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.EntityFrameworkCore.Storage;
+
+namespace Microsoft.EntityFrameworkCore
+{
+ ///
+ /// Extensions for the .
+ ///
+ public static class DbContextExensions
+ {
+ ///
+ /// Starts a new transaction.
+ ///
+ ///
+ /// See Transactions in EF Core for more information.
+ ///
+ /// The current .
+ ///
+ /// A that represents the started transaction.
+ ///
+ public static IDbContextTransaction BeginTransaction(this DbContext dbContext)
+ {
+ if (dbContext.Database.GetProviderType() == DatabaseFacadeExtensions.DatabaseProvider.InMemory)
+ return new DbContextTransactionStub();
+
+ return dbContext.Database.BeginTransaction();
+ }
+
+ ///
+ /// Asynchronously starts a new transaction.
+ ///
+ ///
+ ///
+ /// Entity Framework Core does not support multiple parallel operations being run on the same DbContext instance. This
+ /// includes both parallel execution of async queries and any explicit concurrent use from multiple threads.
+ /// Therefore, always await async calls immediately, or use separate DbContext instances for operations that execute
+ /// in parallel. See Avoiding DbContext threading issues
+ /// for more information.
+ ///
+ ///
+ /// See Transactions in EF Core for more information.
+ ///
+ ///
+ /// The current .
+ /// A to observe while waiting for the task to complete.
+ ///
+ /// A task that represents the asynchronous transaction initialization. The task result contains a that represents the started transaction.
+ ///
+ /// If the is canceled.
+ public static Task BeginTransactionAsync(this DbContext dbContext, CancellationToken cancellationToken)
+ {
+ if (dbContext.Database.GetProviderType() == DatabaseFacadeExtensions.DatabaseProvider.InMemory)
+ return Task.FromResult(new DbContextTransactionStub());
+
+ return dbContext.Database.BeginTransactionAsync(cancellationToken);
+ }
+
+ ///
+ private class DbContextTransactionStub : IDbContextTransaction
+ {
+ ///
+ public Guid TransactionId { get; private set; } = Guid.NewGuid();
+
+ ///
+ public void Commit()
+ { }
+
+ ///
+ public Task CommitAsync(CancellationToken cancellationToken = default)
+ => Task.CompletedTask;
+
+ ///
+ public void Dispose()
+ { }
+
+ ///
+ public ValueTask DisposeAsync()
+ => new(Task.CompletedTask);
+
+ ///
+ public void Rollback()
+ { }
+
+ ///
+ public Task RollbackAsync(CancellationToken cancellationToken = default)
+ => Task.CompletedTask;
+ }
+ }
+}
diff --git a/AMWD.Common/Logging/FileLogger.cs b/AMWD.Common/Logging/FileLogger.cs
index 73d233a..834c34f 100644
--- a/AMWD.Common/Logging/FileLogger.cs
+++ b/AMWD.Common/Logging/FileLogger.cs
@@ -14,9 +14,9 @@ namespace AMWD.Common.Logging
/// Implements a file logging based on the interface.
///
///
- /// This implementation is also implementing the interface!
+ /// This implementation is also using the interface!
///
- /// Inspired by
+ /// Inspired by ConsoleLogger.cs
///
///
///