123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- using Ant.Exceptions;
- using Ant.Frame;
- using Ant.ORM;
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Data.SqlTypes;
- using System.Linq;
- using System.Text;
- namespace Ant.Mapper
- {
- public class ObjectActivator : IObjectActivator
- {
- int? _checkNullOrdinal;
- Func<IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> _instanceCreator;
- List<int> _readerOrdinals;
- List<IObjectActivator> _objectActivators;
- List<IValueSetter> _memberSetters;
- ReaderOrdinalEnumerator _readerOrdinalEnumerator;
- ObjectActivatorEnumerator _objectActivatorEnumerator;
- public ObjectActivator(Func<IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> instanceCreator, List<int> readerOrdinals, List<IObjectActivator> objectActivators, List<IValueSetter> memberSetters, int? checkNullOrdinal)
- {
- this._instanceCreator = instanceCreator;
- this._readerOrdinals = readerOrdinals;
- this._objectActivators = objectActivators;
- this._memberSetters = memberSetters;
- this._checkNullOrdinal = checkNullOrdinal;
- this._readerOrdinalEnumerator = new ReaderOrdinalEnumerator(readerOrdinals);
- this._objectActivatorEnumerator = new ObjectActivatorEnumerator(objectActivators);
- }
- public virtual object CreateInstance(IDataReader reader)
- {
- if (this._checkNullOrdinal != null)
- {
- if (reader.IsDBNull(this._checkNullOrdinal.Value))
- return null;
- }
- this._readerOrdinalEnumerator.Reset();
- this._objectActivatorEnumerator.Reset();
- object obj = null;
- try
- {
- obj = this._instanceCreator(reader, this._readerOrdinalEnumerator, this._objectActivatorEnumerator);
- }
- catch (AntORMException)
- {
- throw;
- }
- catch (Exception ex)
- {
- if (this._readerOrdinalEnumerator.CurrentOrdinal >= 0)
- {
- throw new AntORMException(AppendErrorMsg(reader, this._readerOrdinalEnumerator.CurrentOrdinal, ex), ex);
- }
- throw;
- }
- IValueSetter memberSetter = null;
- try
- {
- int count = this._memberSetters.Count;
- for (int i = 0; i < count; i++)
- {
- //可以用给实体加一些属性赋值
- memberSetter = this._memberSetters[i];
- memberSetter.SetValue(obj, reader);
- }
- }
- catch (AntORMException)
- {
- throw;
- }
- catch (Exception ex)
- {
- MappingMemberBinder binder = memberSetter as MappingMemberBinder;
- if (binder != null)
- {
- throw new AntORMException(AppendErrorMsg(reader, binder.Ordinal, ex), ex);
- }
- throw;
- }
- return obj;
- }
- public static string AppendErrorMsg(IDataReader reader, int ordinal, Exception ex)
- {
- string msg = null;
- if (ex is InvalidCastException)
- {
- 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);
- }
- else if (reader.IsDBNull(ordinal))
- {
- 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);
- }
- else
- msg = string.Format("Error: {0}({1},{2},{3})", reader.GetName(ordinal), ordinal.ToString(), reader.GetDataTypeName(ordinal), reader.GetFieldType(ordinal).FullName);
- return msg;
- }
- }
- public class ObjectActivatorWithTracking : ObjectActivator
- {
- AntORM _dbContext;
- public ObjectActivatorWithTracking(Func<IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> instanceCreator, List<int> readerOrdinals, List<IObjectActivator> objectActivators, List<IValueSetter> memberSetters, int? checkNullOrdinal, AntORM dbContext)
- : base(instanceCreator, readerOrdinals, objectActivators, memberSetters, checkNullOrdinal)
- {
- this._dbContext = dbContext;
- }
- public override object CreateInstance(IDataReader reader)
- {
- object obj = base.CreateInstance(reader);
- if (obj != null)
- this._dbContext.TrackEntity(obj);
- return obj;
- }
- }
- }
|