示例#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);
        }
        public IFitter CreateFitter(IDbContext dbContext)
        {
            IFitter elementFitter = this.ElementActivatorCreator.CreateFitter(dbContext);

            ComplexObjectActivatorCreator elementActivatorCreator = (ComplexObjectActivatorCreator)this.ElementActivatorCreator;
            TypeDescriptor elementTypeDescriptor = EntityTypeContainer.GetDescriptor(elementActivatorCreator.ObjectType);

            List <Tuple <PropertyDescriptor, int> > keys = new List <Tuple <PropertyDescriptor, int> >(elementTypeDescriptor.PrimaryKeys.Count);

            foreach (PrimitivePropertyDescriptor primaryKey in elementTypeDescriptor.PrimaryKeys)
            {
                keys.Add(new Tuple <PropertyDescriptor, int>(primaryKey, elementActivatorCreator.PrimitiveMembers[primaryKey.Definition.Property]));
            }

            IEntityRowComparer entityRowComparer = new EntityRowComparer(keys);

            PropertyDescriptor elementOwnerProperty = elementTypeDescriptor.ComplexPropertyDescriptors.Where(a => a.Definition.Property.PropertyType == this.OwnerType).First();

            CollectionObjectFitter fitter = new CollectionObjectFitter(this.ElementActivatorCreator.CreateObjectActivator(dbContext), entityRowComparer, elementFitter, elementOwnerProperty);

            return(fitter);
        }