Exemple #1
0
        /// <summary>
        /// Definition specifying which property (navigation) will be cloned
        /// </summary>
        /// <typeparam name="TProperty">Type of property, ie. entity type of oposite side</typeparam>
        /// <param name="clonedProperty">Property selector which property should be cloned</param>
        /// <returns>The self instance</returns>
        protected EntityCloner <TEntity> AddClone <TProperty>(Expression <Func <TEntity, TProperty> > clonedProperty) where TProperty : class
        {
            var propertyName             = ((clonedProperty.Body as MemberExpression)?.Member as PropertyInfo)?.Name;
            var foreignKeysForNavigation = entityPropsDefs.NavigationsMap.First(i => i.Navigation.Name == propertyName).ForeignKeys;

            if (foreignKeysForNavigation.IsNullOrEmpty())
            {
                return(this);
            }
            affectedForeignKeys.AddRange(foreignKeysForNavigation.Select(i => i.Name));
            var foreignKeyValue = source.GetPropertyObjectValue(foreignKeysForNavigation.First().Name);

            if (foreignKeyValue == null)
            {
                return(this);
            }
            var propertyPrimaryKeyName = entityNavigationsMap.NavigationsMap[typeof(TProperty)].PrimaryKeysDefinition.First().Name;
            var propertyEntitySet      = unitOfWork.GetSet <TProperty>();//.AsNoTracking();
            var selectCondition        = CoreExtensions.CreateLambdaEqual <TProperty>(propertyPrimaryKeyName, foreignKeyValue);
            var entityOfProperty       = propertyEntitySet.Where(selectCondition).FirstOrDefault();
            var propertyCloner         = resolveManager.Resolve <IEntityCloner <TProperty> >();
            var outputValue            = propertyCloner.PerformCloning(unitOfWork, entityOfProperty, cloningMode: cloningMode);

            if (cloningMode == CloningMode.Cloning || cloningMode == CloningMode.TreeCreating)
            {
                target.SetPropertyValue(clonedProperty, outputValue);
            }
            return(this);
        }
Exemple #2
0
        /// <summary>
        /// Definition specifying which property (navigation) of ICollection type (many of one-to-many side) will be cloned
        /// </summary>
        /// <typeparam name="TInnerType">Inner type of generic collection</typeparam>
        /// <param name="clonedProperty">Property selector which property should be cloned</param>
        /// <returns>The self instance</returns>
        protected EntityCloner <TEntity> AddClone <TInnerType>(Expression <Func <TEntity, ICollection <TInnerType> > > clonedProperty) where TInnerType : class
        {
            var propertyName         = ((clonedProperty.Body as MemberExpression)?.Member as PropertyInfo)?.Name;
            var collectionDefinition = entityPropsDefs.CollectionNavigationMap.First(i => i.Navigation.Name == propertyName);
            var entitySelectors      =
                collectionDefinition.ForeignKeys.Select(
                    foreignKey => CoreExtensions.CreateLambdaEqual <TInnerType>(foreignKey.DeclaringEntityColumn.Name, source.GetPropertyObjectValue(foreignKey.PrincipalEntityColumn.Name)))
                .ToList();
            var propertyEntitySet = unitOfWork.GetSet <TInnerType>().AsQueryable();

            entitySelectors.ForEach(q => propertyEntitySet = propertyEntitySet.Where(q));
            var instancesToClone = propertyEntitySet.ToList();
            var propertyCloner   = resolveManager.Resolve <IEntityCloner <TInnerType> >();

            if (cloningMode == CloningMode.Cloning || cloningMode == CloningMode.TreeCreating)
            {
                target.SetPropertyValue(clonedProperty, instancesToClone.Select(i => propertyCloner.PerformCloning(unitOfWork, i,
                                                                                                                   tg => collectionDefinition.ForeignKeys.ForEach(
                                                                                                                       foreignKey => tg.SetPropertyValue(foreignKey.DeclaringEntityColumn.Name, target.GetPropertyObjectValue(foreignKey.PrincipalEntityColumn.Name))), cloningMode: cloningMode
                                                                                                                   )).ToList());
            }
            if (cloningMode == CloningMode.Deleting)
            {
                instancesToClone.ForEach(i => propertyCloner.PerformCloning(unitOfWork, i, cloningMode: cloningMode));
            }
            return(this);
        }
        public void CreateLambdaEqual()
        {
            int equalityValue = 101;
            var lambda        = CoreExtensions.CreateLambdaEqual <SomeDemoObject>("Integer", equalityValue);

            lambda.Should().NotBeNull();

            List <SomeDemoObject> theList = new List <SomeDemoObject>()
            {
                new SomeDemoObject()
                {
                    Integer = 5
                },
                new SomeDemoObject()
                {
                    Type = "Demo"
                },
                new SomeDemoObject()
                {
                    Integer = equalityValue
                }
            };

            var sdo = theList.AsQueryable().FirstOrDefault(lambda);

            sdo.Should().NotBeNull();
            sdo.Integer.Should().Be(equalityValue);
        }
        public void CreateLambdaEqualInvalidPropertyNameShouldThrow()
        {
            Action act = () => CoreExtensions.CreateLambdaEqual <SomeDemoObject>("NotFoundPropertyName", "test");

            act.ShouldThrowExactly <ArgumentException>("Named property not found from the object.");
        }
        public void CreateLambdaEqualPropertyNameIsNullShouldThrow()
        {
            Action act = () => CoreExtensions.CreateLambdaEqual <SomeDemoObject>(null, "test");

            act.ShouldThrowExactly <ArgumentNullException>("Property name argument is null.");
        }