public void SaveDynamicPropertyValues(IHasDynamicProperties owner) { if (owner == null) { throw new ArgumentNullException("owner"); } //Because one DynamicPropertyEntity may update for multiple object in same time //need create fresh repository for each object to prevent collisions and overrides property values var objectsWithDynamicProperties = owner.GetFlatObjectsListWithInterface <IHasDynamicProperties>(); foreach (var objectWithDynamicProperties in objectsWithDynamicProperties) { using (var repository = _repositoryFactory()) using (var changeTracker = GetChangeTracker(repository)) { if (objectWithDynamicProperties.Id != null) { var result = new List <DynamicPropertyObjectValue>(); if (objectWithDynamicProperties.DynamicProperties != null && objectsWithDynamicProperties.Any()) { var objectType = GetObjectTypeName(objectWithDynamicProperties); var target = new { Properties = new ObservableCollection <DynamicPropertyEntity>(repository.GetObjectDynamicProperties(objectType, objectWithDynamicProperties.Id)) }; var source = new { Properties = new ObservableCollection <DynamicPropertyEntity>(objectWithDynamicProperties.DynamicProperties.Select(x => x.ToEntity())) }; changeTracker.Attach(target); source.Properties.Patch(target.Properties, (sourcePopValue, targetPropValue) => sourcePopValue.Patch(targetPropValue)); } } repository.UnitOfWork.Commit(); } } }
public static T GetDynamicPropertyValue <T>(this IHasDynamicProperties owner, string propertyName, T defaultValue) { var result = defaultValue; if (owner != null && owner.DynamicProperties != null) { var propValue = owner.DynamicProperties.Where(v => v.Name == propertyName && v.Values != null) .SelectMany(v => v.Values) .FirstOrDefault(); if (propValue != null && propValue.Value != null) { var jObject = propValue.Value as JObject; var dictItem = propValue.Value as DynamicPropertyDictionaryItem; if (jObject != null) { dictItem = jObject.ToObject <DynamicPropertyDictionaryItem>(); } if (dictItem != null) { result = (T)(object)dictItem.Name; } else { result = (T)propValue.Value; } } } return(result); }
public static async Task ResolveMetaDataAsync(this IHasDynamicProperties owner, IDynamicPropertyMetaDataResolver metaDataResolver) { if (owner == null) { throw new ArgumentNullException(nameof(owner)); } if (metaDataResolver == null) { throw new ArgumentNullException(nameof(metaDataResolver)); } foreach (var propertyValue in owner.DynamicProperties ?? Array.Empty <DynamicObjectProperty>()) { if (propertyValue.IsTransient() && !string.IsNullOrEmpty(propertyValue.Name)) { var metadata = await metaDataResolver.GetByNameAsync(owner.ObjectType, propertyValue.Name); if (metadata != null) { propertyValue.SetMetaData(metadata); } } } }
public void SaveDynamicPropertyValues(IHasDynamicProperties owner) { if (owner == null) { throw new ArgumentNullException("owner"); } //Because one DynamicPropertyEntity may update for multiple object in same time //need create fresh repository for each object to prevent collisions and overrides property values var objectsWithDynamicProperties = owner.GetFlatObjectsListWithInterface <IHasDynamicProperties>(); foreach (var objectWithDynamicProperties in objectsWithDynamicProperties) { using (var repository = _repositoryFactory()) using (var changeTracker = GetChangeTracker(repository)) { if (objectWithDynamicProperties.Id != null) { if (objectWithDynamicProperties.DynamicProperties != null && objectsWithDynamicProperties.Any()) { var objectType = GetObjectTypeName(objectWithDynamicProperties); var sourceCollection = objectWithDynamicProperties.DynamicProperties.Select(x => x.ToEntity(objectWithDynamicProperties.Id, objectType)); var targetCollection = repository.GetObjectDynamicProperties(objectType, objectWithDynamicProperties.Id); var target = new { Properties = new ObservableCollection <DynamicPropertyEntity>(targetCollection) }; var source = new { Properties = new ObservableCollection <DynamicPropertyEntity>(sourceCollection) }; //When creating DynamicProperty manually, many properties remain unfilled (except Name, ValueType and ObjectValues). //We have to set them with data from the repository. var transistentProperties = sourceCollection.Where(x => x.IsTransient()); if (transistentProperties.Any()) { var allTypeProperties = repository.GetDynamicPropertiesForType(objectType); foreach (var transistentPropery in transistentProperties) { var property = allTypeProperties.FirstOrDefault(x => String.Equals(x.Name, transistentPropery.Name, StringComparison.InvariantCultureIgnoreCase) && x.ValueType == transistentPropery.ValueType); if (property != null) { transistentPropery.Id = property.Id; transistentPropery.ObjectType = property.ObjectType; transistentPropery.IsArray = property.IsArray; transistentPropery.IsRequired = property.IsRequired; } } } changeTracker.Attach(target); source.Properties.Patch(target.Properties, (sourcePop, targetProp) => sourcePop.Patch(targetProp)); } } repository.UnitOfWork.Commit(); } } }
public static void SetObjectId(this IHasDynamicProperties owner, string id) { if (owner != null && owner.DynamicProperties != null) { owner.Id = id; foreach (var dynamicObjectProperty in owner.DynamicProperties) { dynamicObjectProperty.ObjectId = id; } } }
private static FilteredBrowsing GetFilteredBrowsing(IHasDynamicProperties store) { FilteredBrowsing result = null; var filterSettingValue = store.GetDynamicPropertyValue("FilteredBrowsing", string.Empty); if (!string.IsNullOrEmpty(filterSettingValue)) { var reader = new StringReader(filterSettingValue); var serializer = new XmlSerializer(typeof(FilteredBrowsing)); result = serializer.Deserialize(reader) as FilteredBrowsing; } return(result); }
public void SaveDynamicPropertyValues(IHasDynamicProperties owner) { if (owner == null) { throw new ArgumentNullException(nameof(owner)); } var objectsWithDynamicProperties = owner.GetFlatObjectsListWithInterface <IHasDynamicProperties>().Where(x => !string.IsNullOrEmpty(x.Id) && !x.DynamicProperties.IsNullOrEmpty()); //Ensure what all properties have proper ObjectId and ObjectType properties set foreach (var obj in objectsWithDynamicProperties) { foreach (var prop in obj.DynamicProperties) { prop.ObjectId = obj.Id; prop.ObjectType = GetObjectTypeName(obj); } } var pkMap = new PrimaryKeyResolvingMap(); using (var repository = _repositoryFactory()) using (var changeTracker = GetChangeTracker(repository)) { var objectTypes = objectsWithDynamicProperties.Select(x => GetObjectTypeName(x)).Distinct().ToArray(); //Converting all incoming properties to db entity and group property values of all objects use for that property.objectType and property.name as complex key var modifiedPropertyEntitiesGroup = objectsWithDynamicProperties.SelectMany(x => x.DynamicProperties.Select(dp => AbstractTypeFactory <DynamicPropertyEntity> .TryCreateInstance().FromModel(dp, pkMap))) .GroupBy(x => $"{x.Name}:{x.ObjectType}"); var originalPropertyEntitites = repository.GetObjectDynamicProperties(objectTypes, objectsWithDynamicProperties.Select(x => x.Id).Distinct().ToArray()).ToList(); foreach (var modifiedPropertyEntityGroupItem in modifiedPropertyEntitiesGroup) { var modifiedPropertyObjectValues = modifiedPropertyEntityGroupItem.SelectMany(x => x.ObjectValues) .Where(x => x.GetValue(EnumUtility.SafeParse(x.ValueType, DynamicPropertyValueType.LongText)) != null) .ToList(); //Try to find original property with same complex key var originalEntity = originalPropertyEntitites.FirstOrDefault(x => $"{x.Name}:{x.ObjectType}".EqualsInvariant(modifiedPropertyEntityGroupItem.Key)); if (originalEntity != null) { changeTracker.Attach(originalEntity); //Update only property values var comparer = AnonymousComparer.Create((DynamicPropertyObjectValueEntity x) => $"{x.ObjectId}:{x.ObjectType}:{x.Locale}:{x.GetValue(EnumUtility.SafeParse(x.ValueType, DynamicPropertyValueType.LongText))}"); modifiedPropertyObjectValues.Patch(originalEntity.ObjectValues, comparer, (sourceValue, targetValue) => { }); } } repository.UnitOfWork.Commit(); pkMap.ResolvePrimaryKeys(); } }
public void LoadDynamicPropertyValues(IHasDynamicProperties owner) { var propOwners = owner.GetFlatObjectsListWithInterface <IHasDynamicProperties>(); using (var repository = _repositoryFactory()) { var objectTypeNames = propOwners.Select(x => GetObjectTypeName(x)).Distinct().ToArray(); var objectIds = propOwners.Select(x => x.Id).Distinct().ToArray(); var dbDynamicPorps = repository.GetObjectDynamicProperties(objectTypeNames, objectIds); foreach (var propOwner in propOwners) { var objectType = GetObjectTypeName(propOwner); propOwner.DynamicProperties = dbDynamicPorps.Where(x => x.ObjectType == objectType).Select(p => p.ToDynamicObjectProperty(propOwner.Id)).ToList(); propOwner.ObjectType = GetObjectTypeName(propOwner); } } }
public static T GetDynamicPropertyValue <T>(this IHasDynamicProperties owner, string propertyName, T defaultValue) { var result = defaultValue; if (owner != null && owner.DynamicProperties != null) { var propValue = owner.DynamicProperties.Where(v => v.Name == propertyName && v.Values != null) .SelectMany(v => v.Values) .FirstOrDefault(); if (propValue != null) { result = (T)propValue.Value; } } return(result); }
public virtual async Task DeleteDynamicPropertyValuesAsync(IHasDynamicProperties owner) { var objectsWithDynamicProperties = owner.GetFlatObjectsListWithInterface <IHasDynamicProperties>(); using (var repository = _repositoryFactory()) { foreach (var objectHasDynamicProperties in objectsWithDynamicProperties.Where(x => x.Id != null)) { var values = await repository.DynamicPropertyObjectValues.Where(v => v.ObjectType == objectHasDynamicProperties.ObjectType && v.ObjectId == objectHasDynamicProperties.Id) .ToListAsync(); foreach (var value in values) { repository.Remove(value); } } await repository.UnitOfWork.CommitAsync(); } }
public static async Task ResolveMetaDataRecursiveAsync(this IHasDynamicProperties owner, IDynamicPropertyMetaDataResolver metaDataResolver) { if (owner == null) { throw new ArgumentNullException(nameof(owner)); } if (metaDataResolver == null) { throw new ArgumentNullException(nameof(metaDataResolver)); } var hasDynProps = owner.GetFlatObjectsListWithInterface <IHasDynamicProperties>(); foreach (var hasDynProp in hasDynProps) { await ResolveMetaDataAsync(hasDynProp, metaDataResolver); } }
public void DeleteDynamicPropertyValues(IHasDynamicProperties owner) { var objectsWithDynamicProperties = owner.GetFlatObjectsListWithInterface <IHasDynamicProperties>(); using (var repository = _repositoryFactory()) { foreach (var objectHasDynamicProperties in objectsWithDynamicProperties.Where(x => x.Id != null)) { var objectType = GetObjectTypeName(objectHasDynamicProperties); var objectId = objectHasDynamicProperties.Id; var values = repository.DynamicPropertyObjectValues.Where(v => v.ObjectType == objectType && v.ObjectId == objectId) .ToList(); foreach (var value in values) { repository.Remove(value); } } repository.UnitOfWork.Commit(); } }
public void LoadDynamicPropertyValues(IHasDynamicProperties owner) { var objectsWithDynamicProperties = owner.GetFlatObjectsListWithInterface <IHasDynamicProperties>(); foreach (var objectWithDynamicProperties in objectsWithDynamicProperties) { if (objectWithDynamicProperties.Id != null) { using (var repository = _repositoryFactory()) { var objectType = GetObjectTypeName(objectWithDynamicProperties); var properties = repository.GetObjectDynamicProperties(objectType, objectWithDynamicProperties.Id); objectWithDynamicProperties.DynamicProperties = properties.Select(p => p.ToDynamicObjectProperty(objectWithDynamicProperties.Id)).ToList(); //Set object type name objectWithDynamicProperties.ObjectType = objectType; } } } }
public void SaveDynamicPropertyValues(IHasDynamicProperties owner) { if (owner == null) { throw new ArgumentNullException("owner"); } //Because one DynamicPropertyEntity may update for multiple object in same time //need create fresh repository for each object to prevent collisions and overrides property values var objectsHaveDynamicProps = owner.GetFlatObjectsListWithInterface <IHasDynamicProperties>(); foreach (var objectHasDynamicProps in objectsHaveDynamicProps) { using (var repository = _repositoryFactory()) using (var changeTracker = GetChangeTracker(repository)) { var pkMap = new PrimaryKeyResolvingMap(); if (objectHasDynamicProps.Id != null && !objectHasDynamicProps.DynamicProperties.IsNullOrEmpty()) { var objectType = GetObjectTypeName(objectHasDynamicProps); TryToResolveTransientProperties(objectHasDynamicProps.DynamicProperties, objectType); //Load all object properties with values var existPropertyEntities = repository.GetObjectDynamicProperties(new[] { objectType }, new[] { objectHasDynamicProps.Id }); foreach (var dynamicProp in objectHasDynamicProps.DynamicProperties) { var originalEntity = existPropertyEntities.FirstOrDefault(x => x.Id == dynamicProp.Id); var modifiedEntity = AbstractTypeFactory <DynamicPropertyEntity> .TryCreateInstance().FromModel(dynamicProp, pkMap); if (originalEntity != null) { changeTracker.Attach(originalEntity); modifiedEntity.Patch(originalEntity); } } CommitChanges(repository); repository.UnitOfWork.Commit(); } } } }
public async Task LoadDynamicPropertyValuesTest(IHasDynamicProperties entity, List <DynamicPropertyObjectValue> expectedResults) { // Arrange var dynamicPropertySearchServiceMock = new Mock <IDynamicPropertySearchService>(); dynamicPropertySearchServiceMock .Setup(x => x.SearchDynamicPropertiesAsync(It.Is <DynamicPropertySearchCriteria>(x => x.ObjectType == entity.ObjectType))) .Returns(Task.FromResult(new DynamicPropertySearchResult { Results = Properties })); // Act var target = new DynamicPropertyResolverService(dynamicPropertySearchServiceMock.Object); var result = await target.LoadDynamicPropertyValues(entity, "en-US"); // Assert foreach (var expected in expectedResults) { result.Should().ContainSingle(x => x.PropertyName == expected.PropertyName); } }
/// <summary> /// Copies property values from one object to another using property name and type for comparison /// </summary> /// <param name="sourceOwner"></param> /// <param name="targetOwner"></param> public static void CopyPropertyValuesFrom(this IHasDynamicProperties targetOwner, IHasDynamicProperties sourceOwner) { if (sourceOwner == null) { throw new ArgumentNullException(nameof(sourceOwner)); } if (targetOwner == null) { throw new ArgumentNullException(nameof(targetOwner)); } var comparer = AnonymousComparer.Create((DynamicProperty x) => x.Name.ToLowerInvariant() + ":" + x.ValueType); // Copy property values for same properties from one object to other sourceOwner.DynamicProperties.CompareTo(targetOwner.DynamicProperties, comparer, (state, sourceProp, targetProp) => { if (state == EntryState.Modified) { targetProp.Values = sourceProp.Values; } }); }
private static string[] GetPropValue(IHasDynamicProperties member, string propName) { try { var dynamicProp = member.DynamicProperties.FirstOrDefault(x => x.Name == propName); if (dynamicProp != null) { if (dynamicProp.Values != null && dynamicProp.Values.Count != 0) { return(dynamicProp.Values.Select(x => x.Value.ToString()).ToArray()); } return(new string[] { }); } } catch (Exception ex) { return(new string[] { }); } return(new string[] { }); }
public static T GetDynamicPropertyValue <T>(this IHasDynamicProperties owner, string propertyName, T defaultValue) { var result = defaultValue; var propValue = owner?.DynamicProperties?.Where(p => p.Name == propertyName && p.Values != null) .SelectMany(p => p.Values) .FirstOrDefault(); if (propValue?.Value != null) { var dictItem = propValue.Value as DynamicPropertyDictionaryItem; if (propValue.Value is JObject jObject) { dictItem = jObject.ToObject <DynamicPropertyDictionaryItem>(); } var value = dictItem != null ? dictItem.Name : propValue.Value; result = (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture); } return(result); }
public static void DeepCopyPropertyValues(this IHasDynamicProperties sourceOwner, IHasDynamicProperties targetOwner) { if (sourceOwner == null) { throw new ArgumentNullException("sourceOwner"); } if (targetOwner == null) { throw new ArgumentNullException("targetOwner"); } var comparer = AnonymousComparer.Create((DynamicProperty x) => x.Name.ToLowerInvariant() + ":" + x.ValueType.ToString()); var allExpandedSourceProps = sourceOwner.GetFlatObjectsListWithInterface <IHasDynamicProperties>().SelectMany(x => x.DynamicProperties).ToList(); var allExpandedTargetProps = targetOwner.GetFlatObjectsListWithInterface <IHasDynamicProperties>().SelectMany(x => x.DynamicProperties).ToList(); //Copy property values for same proeprties from one object to other allExpandedSourceProps.CompareTo(allExpandedTargetProps, comparer, (state, sourceProp, targetProp) => { if (state == EntryState.Modified) { targetProp.Values = sourceProp.Values; } }); }
/// <summary> /// Load the dynamic property values for an entity. Include empty meta-data for missing values. /// </summary> /// <returns>Loaded Dynamic Property Values for specified entity</returns> public async Task <IEnumerable <DynamicPropertyObjectValue> > LoadDynamicPropertyValues(IHasDynamicProperties entity, string cultureName) { // actual values var result = entity.DynamicProperties?.SelectMany(x => x.Values) ?? Enumerable.Empty <DynamicPropertyObjectValue>(); if (!cultureName.IsNullOrEmpty()) { result = result.Where(x => x.Locale.IsNullOrEmpty() || x.Locale.EqualsInvariant(cultureName)); } // find and add all the properties without values var criteria = AbstractTypeFactory <DynamicPropertySearchCriteria> .TryCreateInstance(); criteria.ObjectType = entity.ObjectType; criteria.Take = int.MaxValue; var searchResult = await _dynamicPropertySearchService.SearchDynamicPropertiesAsync(criteria); var entryDynamicProperties = entity.DynamicProperties ?? Enumerable.Empty <DynamicObjectProperty>(); var existingDynamicProperties = searchResult.Results .Where(p => entryDynamicProperties.Any(x => x.Id == p.Id || x.Name.EqualsInvariant(p.Name))); var propertiesWithoutValue = searchResult.Results.Except(existingDynamicProperties); var emptyValues = propertiesWithoutValue.Select(x => { var newValue = AbstractTypeFactory <DynamicPropertyObjectValue> .TryCreateInstance(); newValue.ObjectId = entity.Id; newValue.ObjectType = entity.ObjectType; newValue.PropertyId = x.Id; newValue.PropertyName = x.Name; newValue.ValueType = x.ValueType; return(newValue); }); return(result.Union(emptyValues)); }
public void DeleteDynamicPropertyValues(IHasDynamicProperties owner) { var objectsWithDynamicProperties = owner.GetFlatObjectsListWithInterface<IHasDynamicProperties>(); using (var repository = _repositoryFactory()) { foreach (var objectWithDynamicProperties in objectsWithDynamicProperties.Where(x => x.Id != null)) { var objectType = GetObjectTypeName(objectWithDynamicProperties); var objectId = objectWithDynamicProperties.Id; var values = repository.DynamicPropertyObjectValues .Where(v => v.ObjectType == objectType && v.ObjectId == objectId) .ToList(); foreach (var value in values) { repository.Remove(value); } } repository.UnitOfWork.Commit(); } }
public void SaveDynamicPropertyValues(IHasDynamicProperties owner) { if (owner == null) { throw new ArgumentNullException("owner"); } //Because one DynamicPropertyEntity may update for multiple object in same time //need create fresh repository for each object to prevent collisions and overrides property values var objectsWithDynamicProperties = owner.GetFlatObjectsListWithInterface<IHasDynamicProperties>(); foreach (var objectWithDynamicProperties in objectsWithDynamicProperties) { using (var repository = _repositoryFactory()) using (var changeTracker = GetChangeTracker(repository)) { if (objectWithDynamicProperties.Id != null) { if (objectWithDynamicProperties.DynamicProperties != null && objectsWithDynamicProperties.Any()) { var objectType = GetObjectTypeName(objectWithDynamicProperties); var target = new { Properties = new ObservableCollection<DynamicPropertyEntity>(repository.GetObjectDynamicProperties(objectType, objectWithDynamicProperties.Id)) }; var source = new { Properties = new ObservableCollection<DynamicPropertyEntity>(objectWithDynamicProperties.DynamicProperties.Select(x => x.ToEntity(owner.Id))) }; changeTracker.Attach(target); source.Properties.Patch(target.Properties, (sourcePopValue, targetPropValue) => sourcePopValue.Patch(targetPropValue)); } } repository.UnitOfWork.Commit(); } } }
public void LoadDynamicPropertyValues(IHasDynamicProperties owner) { var objectsWithDynamicProperties = owner.GetFlatObjectsListWithInterface<IHasDynamicProperties>(); foreach (var objectWithDynamicProperties in objectsWithDynamicProperties) { if (objectWithDynamicProperties.Id != null) { using (var repository = _repositoryFactory()) { var objectType = GetObjectTypeName(objectWithDynamicProperties); var properties = repository.GetObjectDynamicProperties(objectType, objectWithDynamicProperties.Id); objectWithDynamicProperties.DynamicProperties = properties.Select(p => p.ToDynamicObjectProperty(objectWithDynamicProperties.Id)).ToList(); //Set object type name objectWithDynamicProperties.ObjectType = objectType; } } } }
public void LoadDynamicPropertyValues(IHasDynamicProperties owner) { LoadDynamicPropertyValues(new[] { owner }); }
public virtual DynamicPropertyObjectValueEntity FromModel(DynamicPropertyObjectValue propValue, IHasDynamicProperties owner, DynamicProperty dynamicProperty) { if (propValue == null) { throw new ArgumentNullException(nameof(propValue)); } Locale = propValue.Locale; ObjectId = propValue.ObjectId ?? owner.Id; ObjectType = propValue.ObjectType ?? owner.ObjectType ?? owner.GetType().FullName; var dynamicPropertyValueType = propValue.ValueType == DynamicPropertyValueType.Undefined ? dynamicProperty.ValueType : propValue.ValueType; ValueType = dynamicPropertyValueType.ToString(); PropertyId = propValue.PropertyId ?? dynamicProperty.Id; PropertyName = propValue.PropertyName ?? dynamicProperty.Name; DictionaryItemId = propValue.ValueId; var dictItem = propValue.Value as DynamicPropertyDictionaryItem; if (dictItem == null && propValue.Value is JObject jObject) { dictItem = jObject.ToObject <DynamicPropertyDictionaryItem>(); } if (dictItem != null) { DictionaryItemId = dictItem.Id; PropertyId = dictItem.PropertyId; ShortTextValue = dictItem.Name; } else { SetValue(dynamicPropertyValueType, propValue.Value); } return(this); }
public DynamicPropertiesMetaObject(Expression parameter, IHasDynamicProperties value) : base(parameter, BindingRestrictions.Empty, value) { Contract.Requires(parameter != null); }
public void SaveDynamicPropertyValues(IHasDynamicProperties owner) { if (owner == null) { throw new ArgumentNullException("owner"); } //Because one DynamicPropertyEntity may update for multiple object in same time //need create fresh repository for each object to prevent collisions and overrides property values var objectsWithDynamicProperties = owner.GetFlatObjectsListWithInterface<IHasDynamicProperties>(); foreach (var objectWithDynamicProperties in objectsWithDynamicProperties) { using (var repository = _repositoryFactory()) using (var changeTracker = GetChangeTracker(repository)) { if (objectWithDynamicProperties.Id != null) { if (objectWithDynamicProperties.DynamicProperties != null && objectsWithDynamicProperties.Any()) { var objectType = GetObjectTypeName(objectWithDynamicProperties); var sourceCollection = objectWithDynamicProperties.DynamicProperties.Select(x => x.ToEntity(objectWithDynamicProperties.Id, objectType)); var targetCollection = repository.GetObjectDynamicProperties(new[] { objectType }, new[] { objectWithDynamicProperties.Id }); var target = new { Properties = new ObservableCollection<DynamicPropertyEntity>(targetCollection) }; var source = new { Properties = new ObservableCollection<DynamicPropertyEntity>(sourceCollection) }; //When creating DynamicProperty manually, many properties remain unfilled (except Name, ValueType and ObjectValues). //We have to set them with data from the repository. var transistentProperties = source.Properties.Where(x => x.IsTransient()); if (transistentProperties.Any()) { var allTypeProperties = repository.GetDynamicPropertiesForType(objectType); foreach (var transistentPropery in transistentProperties) { var property = allTypeProperties.FirstOrDefault(x => String.Equals(x.Name, transistentPropery.Name, StringComparison.InvariantCultureIgnoreCase)); if (property != null) { transistentPropery.Id = property.Id; transistentPropery.ObjectType = property.ObjectType; transistentPropery.IsArray = property.IsArray; transistentPropery.IsRequired = property.IsRequired; transistentPropery.ValueType = property.ValueType; } } } changeTracker.Attach(target); foreach (var sourceProperty in source.Properties) { var targetProperty = target.Properties.FirstOrDefault(x => x.Id == sourceProperty.Id); if (targetProperty != null) { if (!sourceProperty.ObjectValues.IsNullCollection()) { sourceProperty.ObjectValues.Patch(targetProperty.ObjectValues, new DynamicPropertyObjectValueComparer(), (sourceValue, targetValue) => sourceValue.Patch(targetValue)); } } } } } repository.UnitOfWork.Commit(); } } }
public void LoadDynamicPropertyValues(IHasDynamicProperties owner) { var propOwners = owner.GetFlatObjectsListWithInterface<IHasDynamicProperties>(); using (var repository = _repositoryFactory()) { var objectTypeNames = propOwners.Select(x => GetObjectTypeName(x)).Distinct().ToArray(); var objectIds = propOwners.Select(x => x.Id).Distinct().ToArray(); var dbDynamicPorps = repository.GetObjectDynamicProperties(objectTypeNames, objectIds); foreach (var propOwner in propOwners) { var objectType = GetObjectTypeName(propOwner); propOwner.DynamicProperties = dbDynamicPorps.Where(x => x.ObjectType == objectType).Select(p => p.ToDynamicObjectProperty(propOwner.Id)).ToList(); propOwner.ObjectType = GetObjectTypeName(propOwner); } } }
public void SaveDynamicPropertyValues(IHasDynamicProperties owner) { SaveDynamicPropertyValuesInternal(owner, (x) => x.Id); }