ObjectActivator.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. using Ant.Exceptions;
  2. using Ant.Frame;
  3. using Ant.ORM;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Data.SqlTypes;
  8. using System.Linq;
  9. using System.Text;
  10. namespace Ant.Mapper
  11. {
  12. public class ObjectActivator : IObjectActivator
  13. {
  14. int? _checkNullOrdinal;
  15. Func<IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> _instanceCreator;
  16. List<int> _readerOrdinals;
  17. List<IObjectActivator> _objectActivators;
  18. List<IValueSetter> _memberSetters;
  19. ReaderOrdinalEnumerator _readerOrdinalEnumerator;
  20. ObjectActivatorEnumerator _objectActivatorEnumerator;
  21. public ObjectActivator(Func<IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> instanceCreator, List<int> readerOrdinals, List<IObjectActivator> objectActivators, List<IValueSetter> memberSetters, int? checkNullOrdinal)
  22. {
  23. this._instanceCreator = instanceCreator;
  24. this._readerOrdinals = readerOrdinals;
  25. this._objectActivators = objectActivators;
  26. this._memberSetters = memberSetters;
  27. this._checkNullOrdinal = checkNullOrdinal;
  28. this._readerOrdinalEnumerator = new ReaderOrdinalEnumerator(readerOrdinals);
  29. this._objectActivatorEnumerator = new ObjectActivatorEnumerator(objectActivators);
  30. }
  31. public virtual object CreateInstance(IDataReader reader)
  32. {
  33. if (this._checkNullOrdinal != null)
  34. {
  35. if (reader.IsDBNull(this._checkNullOrdinal.Value))
  36. return null;
  37. }
  38. this._readerOrdinalEnumerator.Reset();
  39. this._objectActivatorEnumerator.Reset();
  40. object obj = null;
  41. try
  42. {
  43. obj = this._instanceCreator(reader, this._readerOrdinalEnumerator, this._objectActivatorEnumerator);
  44. }
  45. catch (AntORMException)
  46. {
  47. throw;
  48. }
  49. catch (Exception ex)
  50. {
  51. if (this._readerOrdinalEnumerator.CurrentOrdinal >= 0)
  52. {
  53. throw new AntORMException(AppendErrorMsg(reader, this._readerOrdinalEnumerator.CurrentOrdinal, ex), ex);
  54. }
  55. throw;
  56. }
  57. IValueSetter memberSetter = null;
  58. try
  59. {
  60. int count = this._memberSetters.Count;
  61. for (int i = 0; i < count; i++)
  62. {
  63. //可以用给实体加一些属性赋值
  64. memberSetter = this._memberSetters[i];
  65. memberSetter.SetValue(obj, reader);
  66. }
  67. }
  68. catch (AntORMException)
  69. {
  70. throw;
  71. }
  72. catch (Exception ex)
  73. {
  74. MappingMemberBinder binder = memberSetter as MappingMemberBinder;
  75. if (binder != null)
  76. {
  77. throw new AntORMException(AppendErrorMsg(reader, binder.Ordinal, ex), ex);
  78. }
  79. throw;
  80. }
  81. return obj;
  82. }
  83. public static string AppendErrorMsg(IDataReader reader, int ordinal, Exception ex)
  84. {
  85. string msg = null;
  86. if (ex is InvalidCastException)
  87. {
  88. msg = string.Format("Please make sure that the member of the column '{0}'({1},{2},{3}) map is the correct type.", reader.GetName(ordinal), ordinal.ToString(), reader.GetDataTypeName(ordinal), reader.GetFieldType(ordinal).FullName);
  89. }
  90. else if (reader.IsDBNull(ordinal))
  91. {
  92. msg = string.Format("Please make sure that the member of the column '{0}'({1},{2},{3}) map is nullable.", reader.GetName(ordinal), ordinal.ToString(), reader.GetDataTypeName(ordinal), reader.GetFieldType(ordinal).FullName);
  93. }
  94. else
  95. msg = string.Format("Error: {0}({1},{2},{3})", reader.GetName(ordinal), ordinal.ToString(), reader.GetDataTypeName(ordinal), reader.GetFieldType(ordinal).FullName);
  96. return msg;
  97. }
  98. }
  99. public class ObjectActivatorWithTracking : ObjectActivator
  100. {
  101. AntORM _dbContext;
  102. public ObjectActivatorWithTracking(Func<IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> instanceCreator, List<int> readerOrdinals, List<IObjectActivator> objectActivators, List<IValueSetter> memberSetters, int? checkNullOrdinal, AntORM dbContext)
  103. : base(instanceCreator, readerOrdinals, objectActivators, memberSetters, checkNullOrdinal)
  104. {
  105. this._dbContext = dbContext;
  106. }
  107. public override object CreateInstance(IDataReader reader)
  108. {
  109. object obj = base.CreateInstance(reader);
  110. if (obj != null)
  111. this._dbContext.TrackEntity(obj);
  112. return obj;
  113. }
  114. }
  115. }