DbLog.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Data.Entity.Infrastructure;
  5. using EMIS.Utility.FormValidate;
  6. using Bowin.Common.Data;
  7. using System.Web;
  8. using System.Data;
  9. using System.Linq.Expressions;
  10. namespace EMIS.Utility.Log
  11. {
  12. public class DbLog
  13. {
  14. public static List<Log_Operate> GetBatchUpdateLog<T>(IList<T> entities, System.Data.Entity.DbContext ctx) where T : class
  15. {
  16. var result = new List<Log_Operate>();
  17. var principal = CustomPrincipal.Current;
  18. var operateUserID = (principal != null) ? (Guid?)principal.UserID : null;
  19. var tableKey = EMIS.Entities.TableKeyDictionary.GetKeyName<T>();
  20. ParameterExpression keyParamter = Expression.Parameter(typeof(DbEntityEntry<T>), "w");
  21. MemberExpression keyEntryExpression = Expression.Property(keyParamter, "Entity");
  22. MemberExpression keyExpression = Expression.Property(keyEntryExpression, tableKey);
  23. var entryList = ctx.ChangeTracker.Entries<T>().ToList();
  24. var originalValues = entities.Select(x => new {
  25. OriginalValues = entryList.FirstOrDefault(
  26. Expression.Lambda<Func<DbEntityEntry<T>, bool>>(
  27. Expression.Equal(keyExpression, Expression.Constant((Guid)typeof(T).GetProperty(tableKey).GetValue(x, null)))
  28. , keyParamter).Compile()).OriginalValues,
  29. CurrentValues = x
  30. }).ToList();
  31. foreach (var updateChange in originalValues)
  32. {
  33. var log = new Log_Operate
  34. {
  35. OperateID = Guid.NewGuid(),
  36. UserID = operateUserID,
  37. IP = ApplicationClientHelper.GetIP(),
  38. TableName = updateChange.CurrentValues.GetType().Name,
  39. SourceUrl = (HttpContext.Current == null) ? null : HttpContext.Current.Request.UrlReferrer.OriginalString,
  40. OperateTime = DateTime.Now
  41. };
  42. log.Operate = "修改";
  43. log.Detail = "修改前内容(" + GatherValues(updateChange.OriginalValues) + "),";
  44. log.Detail += "修改后内容(" + GatherValues(updateChange.CurrentValues) + ")";
  45. result.Add(log);
  46. }
  47. return result;
  48. }
  49. public static List<Log_Operate> GetBulkInsertLog<T>(IList<T> entities)
  50. {
  51. var table = entities.ToTable();
  52. return GetBulkInsertLog(table, typeof(T).Name);
  53. }
  54. public static List<Log_Operate> GetBulkInsertLog(DataTable table, string tableName)
  55. {
  56. var result = new List<Log_Operate>();
  57. var principal = CustomPrincipal.Current;
  58. var operateUserID = (principal != null) ? (Guid?)principal.UserID : null;
  59. var myIP = ApplicationClientHelper.GetIP();
  60. foreach (DataRow row in table.Rows)
  61. {
  62. var value = "详细内容(";
  63. for (int i = 0; i < table.Columns.Count; i++)
  64. {
  65. string columnName = table.Columns[i].ColumnName;
  66. value += columnName + ":";
  67. value += row[columnName].ToString() + "|";
  68. }
  69. if (value.EndsWith("|"))
  70. {
  71. value = value.TrimEnd('|');
  72. }
  73. value += ")";
  74. Log_Operate operate = new Log_Operate()
  75. {
  76. OperateID = Guid.NewGuid(),
  77. UserID = operateUserID,
  78. IP = myIP,
  79. TableName = tableName,
  80. SourceUrl = (HttpContext.Current == null) ? null : HttpContext.Current.Request.UrlReferrer.OriginalString,
  81. OperateTime = DateTime.Now,
  82. Operate = "新增",
  83. Detail = value
  84. };
  85. result.Add(operate);
  86. }
  87. return result;
  88. }
  89. public static List<Log_Operate> GetDeleteLog<T>(IList<T> entities)
  90. {
  91. var table = entities.ToTable();
  92. return GetDeleteLog(table, typeof(T).Name);
  93. }
  94. public static List<Log_Operate> GetDeleteLog(DataTable table, string tableName)
  95. {
  96. var result = new List<Log_Operate>();
  97. var principal = CustomPrincipal.Current;
  98. var operateUserID = (principal != null) ? (Guid?)principal.UserID : null;
  99. var myIP = ApplicationClientHelper.GetIP();
  100. foreach (DataRow row in table.Rows)
  101. {
  102. var value = "删除内容(";
  103. for (int i = 0; i < table.Columns.Count; i++)
  104. {
  105. string columnName = table.Columns[i].ColumnName;
  106. value += columnName + ":";
  107. value += row[columnName].ToString() + "|";
  108. }
  109. if (value.EndsWith("|"))
  110. {
  111. value = value.TrimEnd('|');
  112. }
  113. value += ")";
  114. Log_Operate operate = new Log_Operate()
  115. {
  116. OperateID = Guid.NewGuid(),
  117. UserID = operateUserID,
  118. IP = myIP,
  119. TableName = tableName,
  120. SourceUrl = (HttpContext.Current == null) ? null : HttpContext.Current.Request.UrlReferrer.OriginalString,
  121. OperateTime = DateTime.Now,
  122. Operate = "删除",
  123. Detail = value
  124. };
  125. result.Add(operate);
  126. }
  127. return result;
  128. }
  129. public static List<Log_Operate> GetLog(DbChangeTracker changeTracker)
  130. {
  131. var result = new List<Log_Operate>();
  132. var entryList = changeTracker.Entries().ToList();
  133. var principal = CustomPrincipal.Current;
  134. entryList.ForEach(x => AddLog(x, result, principal));
  135. return result;
  136. }
  137. public static List<Log_Operate> GetRelationshipLog(System.Data.Entity.DbContext ctx)
  138. {
  139. var result = new List<Log_Operate>();
  140. var principal = CustomPrincipal.Current;
  141. var operateUserID = (principal != null) ? (Guid?)principal.UserID : null;
  142. var objectContext = ((IObjectContextAdapter)ctx).ObjectContext;
  143. var deleteChanges = objectContext.ObjectStateManager.GetObjectStateEntries(System.Data.Entity.EntityState.Deleted);
  144. var addChanges = objectContext.ObjectStateManager.GetObjectStateEntries(System.Data.Entity.EntityState.Added);
  145. var myIP = ApplicationClientHelper.GetIP();
  146. foreach(var deleteChange in deleteChanges)
  147. {
  148. if (deleteChange.IsRelationship)
  149. {
  150. var log = new Log_Operate
  151. {
  152. OperateID = Guid.NewGuid(),
  153. UserID = operateUserID,
  154. IP = myIP,
  155. TableName = deleteChange.EntitySet.Name,
  156. SourceUrl = (HttpContext.Current == null) ? null : HttpContext.Current.Request.UrlReferrer.OriginalString,
  157. OperateTime = DateTime.Now,
  158. Operate = "删除",
  159. Detail = "删除内容(" + GatherValues(deleteChange.OriginalValues) + ")"
  160. };
  161. result.Add(log);
  162. }
  163. }
  164. foreach (var addChange in addChanges)
  165. {
  166. if (addChange.IsRelationship)
  167. {
  168. var log = new Log_Operate
  169. {
  170. OperateID = Guid.NewGuid(),
  171. UserID = operateUserID,
  172. IP = myIP,
  173. TableName = addChange.EntitySet.Name,
  174. SourceUrl = (HttpContext.Current == null) ? null : HttpContext.Current.Request.UrlReferrer.OriginalString,
  175. OperateTime = DateTime.Now,
  176. Operate = "新增",
  177. Detail = "详细内容(" + GatherRelationValues(addChange.CurrentValues, objectContext) + ")"
  178. };
  179. result.Add(log);
  180. }
  181. }
  182. return result;
  183. }
  184. private static void AddLog(DbEntityEntry entry, IList<Log_Operate> logList, CustomPrincipal principal)
  185. {
  186. var operateUserID = (principal != null) ? (Guid?)principal.UserID : null;
  187. var log = new Log_Operate {
  188. OperateID = Guid.NewGuid(),
  189. UserID = operateUserID,
  190. IP = ApplicationClientHelper.GetIP(),
  191. TableName = entry.Entity.GetType().Name,
  192. SourceUrl = (HttpContext.Current == null) ? null : HttpContext.Current.Request.UrlReferrer.OriginalString,
  193. OperateTime = DateTime.Now
  194. };
  195. switch (entry.State)
  196. {
  197. case System.Data.Entity.EntityState.Added:
  198. log.Operate = "新增";
  199. log.Detail = "详细内容(" + GatherValues(entry.CurrentValues) + ")";
  200. break;
  201. case System.Data.Entity.EntityState.Modified:
  202. log.Operate = "修改";
  203. log.Detail = "修改前内容(" + GatherValues(entry.OriginalValues) + "),";
  204. log.Detail += "修改后内容(" + GatherValues(entry.CurrentValues) + ")";
  205. break;
  206. case System.Data.Entity.EntityState.Deleted:
  207. log.Operate = "删除";
  208. log.Detail = "删除内容(" + GatherValues(entry.OriginalValues) + ")";
  209. break;
  210. default:
  211. return;
  212. }
  213. logList.Add(log);
  214. }
  215. private static string GatherRelationValues(System.Data.Common.DbDataRecord values,
  216. System.Data.Entity.Core.Objects.ObjectContext context)
  217. {
  218. var result = "";
  219. for (int i = 0; i < values.FieldCount; i ++ )
  220. {
  221. var entry = (System.Data.Entity.Core.EntityKey)values.GetValue(i);
  222. result += entry.EntitySetName + ":";
  223. var entity = context.GetObjectByKey(entry);
  224. var entityType = entity.GetType();
  225. var propertyName = entry.GetEntitySet(context.MetadataWorkspace).ElementType.KeyMembers[0].Name;
  226. var property = entityType.GetProperty(propertyName);
  227. result += property.GetValue(entity, null) + "|";
  228. //foreach (var property in entityType.GetProperties())
  229. //{
  230. // result += property.Name + ":" + property.GetValue(entity, null) + "|";
  231. //}
  232. }
  233. if (result.EndsWith("|"))
  234. {
  235. result = result.TrimEnd('|');
  236. }
  237. return result;
  238. }
  239. private static string GatherValues(System.Data.Common.DbDataRecord values)
  240. {
  241. var result = "";
  242. for (int i = 0; i < values.FieldCount; i ++ )
  243. {
  244. var entry = (System.Data.Entity.Core.EntityKey)values.GetValue(i);
  245. result += entry.EntitySetName + ":" + entry.EntityKeyValues[0].Value.ToString() + "|";
  246. }
  247. if (result.EndsWith("|"))
  248. {
  249. result = result.TrimEnd('|');
  250. }
  251. return result;
  252. }
  253. private static string GatherValues(DbPropertyValues values)
  254. {
  255. var result = "";
  256. foreach (var propertyName in values.PropertyNames)
  257. {
  258. result += propertyName + ":" + values[propertyName] + "|";
  259. }
  260. if (result.EndsWith("|"))
  261. {
  262. result = result.TrimEnd('|');
  263. }
  264. return result;
  265. }
  266. private static string GatherValues<T>(T entity)
  267. {
  268. var result = "";
  269. var properties = typeof(T).GetProperties();
  270. foreach (var property in properties)
  271. {
  272. if (property.PropertyType.IsPrimitive || property.PropertyType.IsValueType || property.PropertyType.Name.StartsWith("String"))
  273. {
  274. result += property.Name + ":" + (property.GetValue(entity, null) ?? "").ToString() + "|";
  275. }
  276. }
  277. if (result.EndsWith("|"))
  278. {
  279. result = result.TrimEnd('|');
  280. }
  281. return result;
  282. }
  283. }
  284. }