-
Notifications
You must be signed in to change notification settings - Fork 0
/
UnitOfWork.cs
153 lines (123 loc) · 3.79 KB
/
UnitOfWork.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
using System;
using System.Data;
using System.Data.Objects;
using Infrastructure.Data.Abstract;
using log4net;
namespace Infrastructure.Data
{
//TODO This is in progress - Scott Collier 10/28/2014
public class UnitOfWork : IUnitOfWork
{
private readonly IDatabaseContext _context;
// ReSharper disable once InconsistentNaming
private readonly ILog _log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private bool _disposed;
private IDbTransaction _transaction;
public UnitOfWork(IDatabaseContext context)
{
_context = context;
}
public bool IsInTransaction
{
get { return _transaction != null; }
}
public void BeginTransaction()
{
BeginTransaction(IsolationLevel.ReadCommitted);
}
public void BeginTransaction(IsolationLevel isolationLevel)
{
if (_transaction != null)
{
_log.Error(@"Cannot begin a new transaction while an existing transaction is still running.
Please commit or rollback the existing transaction before starting a new one.");
}
OpenConnection();
_transaction = _context.Connection.BeginTransaction(isolationLevel);
}
public void Commit()
{
if (_transaction != null)
{
try
{
_transaction.Commit();
}
catch (Exception ex)
{
_log.Error("An error occurred committing the transaction. " + ex);
_transaction.Rollback();
}
_transaction.Dispose();
_transaction = null;
}
else
{
_log.Error("An error occurred committing the transaction. Transaction could not be opened.");
}
}
public void RollBackTransaction()
{
if (_transaction == null)
{
throw new ApplicationException("Cannot roll back a transaction while there is no transaction running.");
}
if (IsInTransaction)
{
_transaction.Rollback();
ReleaseCurrentTransaction();
}
}
public void CommitTransaction()
{
if (_transaction == null)
{
throw new ApplicationException("Cannot roll back a transaction while there is no transaction running.");
}
try
{
_transaction.Commit();
ReleaseCurrentTransaction();
}
catch
{
RollBackTransaction();
throw;
}
}
private void ReleaseCurrentTransaction()
{
if (_transaction != null)
{
_transaction.Dispose();
_transaction = null;
}
}
private void OpenConnection()
{
if (_context.Connection.State != ConnectionState.Open)
{
_context.Connection.Open();
}
}
#region dispose
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Disposes off the managed and unmanaged resources used.
/// </summary>
/// <param name="disposing"></param>
private void Dispose(bool disposing)
{
if (!disposing)
return;
if (_disposed)
return;
_disposed = true;
}
#endregion
}
}