annotate Source/DataAccess/DataAccessorBase.cs @ 3:1ef98bd70424

!bug 100 +3h Исправление проблемы BLToolkit + mono 3.4
author cin
date Fri, 22 Aug 2014 17:34:46 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using BLToolkit.Aspects;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using BLToolkit.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using BLToolkit.Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Properties;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using BLToolkit.Reflection.Extension;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 namespace BLToolkit.DataAccess
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 public abstract class DataAccessorBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 #region Constructors
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 [System.Diagnostics.DebuggerStepThrough]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 protected DataAccessorBase()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 [System.Diagnostics.DebuggerStepThrough]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 protected DataAccessorBase(DbManager dbManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 SetDbManager(dbManager, false);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 [System.Diagnostics.DebuggerStepThrough]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 protected DataAccessorBase(DbManager dbManager, bool dispose)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 SetDbManager(dbManager, dispose);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 #region Public Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 [NoInterception, System.Diagnostics.DebuggerStepThrough]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 public virtual DbManager GetDbManager()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 return _dbManager ?? CreateDbManager();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 protected virtual DbManager CreateDbManager()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 return new DbManager();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 public virtual void BeginTransaction()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 if (_dbManager == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 throw new InvalidOperationException(Resources.DataAccessorBase_NoDbManager);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 _dbManager.BeginTransaction();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 public virtual void BeginTransaction(IsolationLevel il)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 if (_dbManager == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 throw new InvalidOperationException(Resources.DataAccessorBase_NoDbManager);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 _dbManager.BeginTransaction(il);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 public virtual void CommitTransaction()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 if (_dbManager == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 throw new InvalidOperationException(Resources.DataAccessorBase_NoDbManager);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 _dbManager.CommitTransaction();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 public virtual void RollbackTransaction()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 if (_dbManager == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 throw new InvalidOperationException(Resources.DataAccessorBase_NoDbManager);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 _dbManager.RollbackTransaction();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 private ExtensionList _extensions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 public ExtensionList Extensions
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 get { return _extensions ?? (_extensions = MappingSchema.Extensions); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 set { _extensions = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 private bool _disposeDbManager = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 public virtual bool DisposeDbManager
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 get { return _disposeDbManager; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 set { _disposeDbManager = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 private MappingSchema _mappingSchema;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 public MappingSchema MappingSchema
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 get { return _mappingSchema ?? (_mappingSchema = _dbManager != null? _dbManager.MappingSchema: Map.DefaultSchema); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 set { _mappingSchema = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 #region Protected Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 private DbManager _dbManager;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 protected DbManager DbManager
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 get { return _dbManager; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 protected internal void SetDbManager(DbManager dbManager, bool dispose)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 _dbManager = dbManager;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 _disposeDbManager = dispose;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 protected virtual string GetDefaultSpName(string typeName, string actionName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 return typeName == null?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 actionName:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 string.Format("{0}_{1}", typeName, actionName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 private static readonly Hashtable _actionSproc = new Hashtable();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 protected virtual string GetSpName(Type type, string actionName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 if (type == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 return GetDefaultSpName(null, actionName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 string key = type.FullName + "$" + actionName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 string sprocName = (string)_actionSproc[key];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 if (sprocName == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 object[] attrs = type.GetCustomAttributes(typeof(ActionSprocNameAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 foreach (ActionSprocNameAttribute attr in attrs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 if (attr.ActionName == actionName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 sprocName = attr.ProcedureName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 if (sprocName == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 sprocName = GetDefaultSpName(GetTableName(type), actionName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 _actionSproc[key] = sprocName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 return sprocName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 protected virtual string GetDatabaseName(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 return MappingSchema.MetadataProvider.GetDatabaseName(type, Extensions, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 protected virtual string GetOwnerName(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 return MappingSchema.MetadataProvider.GetOwnerName(type, Extensions, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 protected virtual string GetTableName(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 return MappingSchema.MetadataProvider.GetTableName(type, Extensions, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 protected virtual void Dispose(DbManager dbManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 if (dbManager != null && DisposeDbManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 dbManager.Dispose();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 }