/// <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); }
/// <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."); }