public IObjectActivator CreateObjectActivator(IDbContext dbContext) { EntityMemberMapper mapper = this.ConstructorDescriptor.GetEntityMemberMapper(); List<IValueSetter> memberSetters = new List<IValueSetter>(this.Members.Count + this.EntityMembers.Count); foreach (var kv in this.Members) { IMRM mMapper = mapper.GetMemberMapper(kv.Key); MappingMemberBinder binder = new MappingMemberBinder(mMapper, kv.Value); memberSetters.Add(binder); } foreach (var kv in this.EntityMembers) { Action<object, object> del = mapper.GetNavigationMemberSetter(kv.Key); IObjectActivator memberActivtor = kv.Value.CreateObjectActivator(); NavigationMemberBinder binder = new NavigationMemberBinder(del, memberActivtor); memberSetters.Add(binder); } Func<IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> instanceCreator = this.ConstructorDescriptor.GetInstanceCreator(); List<int> readerOrdinals = this.ConstructorParameters.Select(a => a.Value).ToList(); List<IObjectActivator> objectActivators = this.ConstructorEntityParameters.Select(a => a.Value.CreateObjectActivator()).ToList(); ObjectActivator ret; if (dbContext != null) ret = new ObjectActivatorWithTracking(instanceCreator, readerOrdinals, objectActivators, memberSetters, this.CheckNullOrdinal, dbContext); else ret = new ObjectActivator(instanceCreator, readerOrdinals, objectActivators, memberSetters, this.CheckNullOrdinal); return ret; }
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 (Exception ex) { if (this._readerOrdinalEnumerator.CurrentOrdinal >= 0) { throw new DataException(AppendErrorMsg(reader, this._readerOrdinalEnumerator.CurrentOrdinal), 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 (Exception ex) { MappingMemberBinder binder = memberSetter as MappingMemberBinder; if (binder != null) { throw new DataException(AppendErrorMsg(reader, binder.Ordinal), ex); } throw; } return(obj); }