Skip to content

Commit

Permalink
add TransactionAwareContextFactory in separate project
Browse files Browse the repository at this point in the history
  • Loading branch information
meinsiedler committed Sep 18, 2018
1 parent 34ab6e4 commit 1c57f53
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System;
using System.Collections.Concurrent;
using System.Data.Common;
using System.Data.SqlClient;
using System.Transactions;
using Microsoft.EntityFrameworkCore;

namespace softaware.Cqs.EntityFramework
{
public static class TransactionAwareContextFactory
{
private static ConcurrentDictionary<Transaction, DbConnection> connections = new ConcurrentDictionary<Transaction, DbConnection>();

public static TContext CreateContext<TContext>(
string connectionString,
Func<DbContextOptions<TContext>, TContext> dbContextFuncWithOptions,
Func<DbConnection, TContext> dbContextFuncWithDbConnection)
where TContext : DbContext
{
var currentTransaction = Transaction.Current;
if (currentTransaction == null)
{
var options = new DbContextOptionsBuilder<TContext>()
.UseSqlServer(connectionString)
.Options;

return dbContextFuncWithOptions(options);
}
else
{
var connectionForTransaction = connections.GetOrAdd(currentTransaction, valueFactory: t =>
{
var connection = new SqlConnection(connectionString);
connection.Open();

t.TransactionCompleted += (s, e) =>
{
connection.Close();
connections.TryRemove(t, out var _);
};

return connection;
});

return dbContextFuncWithDbConnection(connectionForTransaction);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Authors>softaware gmbh</Authors>
<Company>softaware gmbh</Company>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageLicenseUrl>https://github.com/softawaregmbh/library-cqs/blob/master/LICENSE</PackageLicenseUrl>
<PackageProjectUrl>https://github.com/softawaregmbh/library-cqs</PackageProjectUrl>
<PackageIconUrl>https://secure.gravatar.com/avatar/d441f5a5514d2afce7da518a89f028d0?s=512&amp;amp;r=g&amp;amp;d=retro</PackageIconUrl>
<RepositoryUrl>https://github.com/softawaregmbh/library-cqs</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>softaware, command-query-separation</PackageTags>
<Description>Adds a generic EntityFramework DbContext factory which is aware of open transactions.</Description>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.3" />
</ItemGroup>

</Project>
6 changes: 6 additions & 0 deletions src/softaware.Cqs.sln
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "softaware.Cqs.SimpleInjecto
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "softaware.Cqs.Decorators.UsageAware", "softaware.Cqs.Decorators.UsageAware\softaware.Cqs.Decorators.UsageAware.csproj", "{B9334117-F235-45CE-9590-9C1CADD6F6BF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "softaware.Cqs.EntityFramework", "softaware.Cqs.EntityFramework\softaware.Cqs.EntityFramework.csproj", "{39EDAF0E-92A0-4E32-9BDF-2389D6024C2D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -39,6 +41,10 @@ Global
{B9334117-F235-45CE-9590-9C1CADD6F6BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B9334117-F235-45CE-9590-9C1CADD6F6BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B9334117-F235-45CE-9590-9C1CADD6F6BF}.Release|Any CPU.Build.0 = Release|Any CPU
{39EDAF0E-92A0-4E32-9BDF-2389D6024C2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{39EDAF0E-92A0-4E32-9BDF-2389D6024C2D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{39EDAF0E-92A0-4E32-9BDF-2389D6024C2D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{39EDAF0E-92A0-4E32-9BDF-2389D6024C2D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down

0 comments on commit 1c57f53

Please sign in to comment.