public IObjectActivator CreateObjectActivator(IDbContext dbContext) { InstanceCreator instanceCreator = this.ConstructorDescriptor.GetInstanceCreator(); List <IObjectActivator> argumentActivators = this.CreateArgumentActivators(dbContext); List <IMemberBinder> memberBinders = this.CreateMemberBinders(dbContext); IObjectActivator objectActivator; if (dbContext != null) { objectActivator = new ObjectActivatorWithTracking(instanceCreator, argumentActivators, memberBinders, this.CheckNullOrdinal, dbContext); } else { objectActivator = new ComplexObjectActivator(instanceCreator, argumentActivators, memberBinders, this.CheckNullOrdinal); } if (this.IsRoot && this.HasMany()) { TypeDescriptor entityTypeDescriptor = EntityTypeContainer.GetDescriptor(this.ObjectType); List <Tuple <PropertyDescriptor, int> > keys = new List <Tuple <PropertyDescriptor, int> >(entityTypeDescriptor.PrimaryKeys.Count); foreach (PrimitivePropertyDescriptor primaryKey in entityTypeDescriptor.PrimaryKeys) { keys.Add(new Tuple <PropertyDescriptor, int>(primaryKey, this.PrimitiveMembers[primaryKey.Definition.Property])); } IEntityRowComparer entityRowComparer = new EntityRowComparer(keys); objectActivator = new RootEntityActivator(objectActivator, this.CreateFitter(dbContext), entityRowComparer); } return(objectActivator); }
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.TryGetMappingMemberMapper(kv.Key); MappingMemberBinder binder = new MappingMemberBinder(mMapper, kv.Value); memberSetters.Add(binder); } foreach (var kv in this.EntityMembers) { Action <object, object> del = mapper.TryGetNavigationMemberSetter(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); }