示例#1
0
        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);
        }
示例#3
0
        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);
                    }
                }
            }
        }
示例#4
0
        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;
                }
            }
        }
示例#6
0
        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();
                }
        }
示例#8
0
        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);
        }
示例#10
0
        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();
            }
        }
示例#11
0
        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();
            }
        }
示例#13
0
        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;
                    }
                }
            }
        }
示例#14
0
        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;
                }
            });
        }
示例#20
0
        /// <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 });
 }
示例#25
0
        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);
                }
            }
        }
示例#29
0
 public void SaveDynamicPropertyValues(IHasDynamicProperties owner)
 {
     SaveDynamicPropertyValuesInternal(owner, (x) => x.Id);
 }