Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }