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 ///
/// ///