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); }