コード例 #1
0
        public DSClientBase(Uri serviceUri, IFactory factory, ISecurityTokenInjector securityTokenInjector)
            : base(serviceUri, DataServiceProtocolVersion.V3)
        {
            _securityTokenInjector = securityTokenInjector;

            this.MergeOption = MergeOption.PreserveChanges;
            this.IgnoreResourceNotFoundException = true;

            _entityFactory = factory;

            ResolveName = (clientType =>
            {
                clientType = _entityFactory.GetBaseType(clientType);
                return(string.Concat(this.GetType().Namespace + ".", clientType.Name));
                //return string.Concat(clientType.Namespace + ".", clientType.Name);
            });

            ResolveType = (entitySetName =>
            {
                return(_entityFactory.GetEntityTypeByStringName(entitySetName.Split('.').Last()));
            });

            IgnoreResourceNotFoundException = true;
            WritingEntity  += this.DSCatalogClient_WritingEntity;
            SendingRequest += DSClientBase_SendingRequest;
            ReadingEntity  += this.DSCatalogClient_ReadingEntity;

            ChangeTracker = CreateChangeTracker();
        }
コード例 #2
0
        public void SaveSettings(SettingEntry[] settings)
        {
            if (settings != null && settings.Any())
            {
                var settingKeys = settings.Select(x => String.Join("-", x.Name, x.ObjectType, x.ObjectId)).Distinct().ToArray();

                using (var repository = _repositoryFactory())
                    using (var changeTracker = new ObservableChangeTracker())
                    {
                        var alreadyExistSettings = repository.Settings
                                                   .Include(s => s.SettingValues)
                                                   .Where(x => settingKeys.Contains(x.Name + "-" + x.ObjectType + "-" + x.ObjectId))
                                                   .ToList();

                        changeTracker.AddAction = x => repository.Add(x);
                        //Need for real remove object from nested collection (because EF default remove references only)
                        changeTracker.RemoveAction = x => repository.Remove(x);

                        var target = new { Settings = new ObservableCollection <SettingEntity>(alreadyExistSettings) };
                        var source = new { Settings = new ObservableCollection <SettingEntity>(settings.Select(x => AbstractTypeFactory <SettingEntity> .TryCreateInstance().FromModel(x))) };

                        changeTracker.Attach(target);
                        var settingComparer = AnonymousComparer.Create((SettingEntity x) => String.Join("-", x.Name, x.ObjectType, x.ObjectId));
                        source.Settings.Patch(target.Settings, settingComparer, (sourceSetting, targetSetting) => sourceSetting.Patch(targetSetting));

                        repository.UnitOfWork.Commit();
                    }

                ClearCache(settings);
            }
        }
コード例 #3
0
        public void CatalogPatchTest()
        {
            var chageTracker = new ObservableChangeTracker
            {
                RemoveAction = (x) =>
                {
                    Console.WriteLine(x.ToString());
                }
            };

            var dbCatalog1 = new dataModel.Catalog
            {
                Name            = "catalog1",
                DefaultLanguage = "en-us"
            };

            dbCatalog1.CatalogLanguages.Add(new dataModel.CatalogLanguage {
                Language = "en-us"
            });
            dbCatalog1.CatalogLanguages.Add(new dataModel.CatalogLanguage {
                Language = "fr-fr"
            });

            var dbCatalog2 = new dataModel.Catalog
            {
                Name = "unknow"
            };

            dbCatalog2.CatalogLanguages.Add(new dataModel.CatalogLanguage {
                Language = "ru-ru"
            });

            chageTracker.Attach(dbCatalog2);
            dbCatalog1.Patch(dbCatalog2);
        }
コード例 #4
0
        public void SaveSettings(SettingEntry[] settings)
        {
            if (settings != null && settings.Any())
            {
                var settingKeys = settings.Select(x => String.Join("-", x.Name, x.ObjectType, x.Id)).Distinct().ToArray();


                using (var changeTracker = new ObservableChangeTracker())
                {
                    var alreadyExistSettings = _baseUnitOfWork.BaseWorkArea.Setting.Query()
                                               .Include(s => s.SettingValues)
                                               .Where(x => settingKeys.Contains(x.Name + "-" + x.ObjectType + "-" + x.Id))
                                               .ToList();

                    changeTracker.AddAction = x => _baseUnitOfWork.ExecuteAndCommit(uow => { uow.BaseWorkArea.Setting.Add((SettingEntity)x); });
                    //Need for real remove object from nested collection (because EF default remove references only)
                    changeTracker.RemoveAction = x => _baseUnitOfWork.ExecuteAndCommit(uow => { uow.BaseWorkArea.Setting.Delete((SettingEntity)x); });

                    var target = new { Settings = new List <SettingEntity>(alreadyExistSettings) };
                    var source = new { Settings = new List <SettingEntity>(settings.Select(x => x.ToEntity())) };

                    changeTracker.Attach(target);
                    var settingComparer = AnonymousComparer.Create((SettingEntity x) => String.Join("-", x.Name, x.ObjectType, x.Id));
                    source.Settings.Patch(target.Settings, settingComparer, (sourceSetting, targetSetting) => sourceSetting.Patch(targetSetting));
                }

                ClearCache();
            }
        }
コード例 #5
0
        private ObservableChangeTracker CreateChangeTracker()
        {
            var retVal = new ObservableChangeTracker();

            retVal.AddAction = (x) =>
            {
                var entry = ChangeTracker.GetTrackingEntry(x);
                _delayedActions.Add(() => SaveEntryChanges(entry));
            };
            retVal.RemoveAction = (x) =>
            {
                var entry = ChangeTracker.GetTrackingEntry(x);
                entry.EntryState = EntryState.Detached;
                var clonedEntry = new TrackingEntry {
                    Entity = x.DeepClone(new AssetEntityFactoryExt()), EntryState = EntryState.Deleted
                };
                _delayedActions.Add(() => SaveEntryChanges(clonedEntry));
            };

            retVal.AddNewOneToManyRelationAction = (source, property, target) =>
            {
                var folder = source as Folder;
                if (folder != null && property == "SubFolders")
                {
                    if (folder.FolderId != null)
                    {
                        ((Folder)target).ParentFolderId = folder.FolderId;
                    }
                }
                else if (folder != null && property == "FolderItems")
                {
                    if (folder.FolderId != null)
                    {
                        ((FolderItem)target).FolderId = folder.FolderId;
                    }
                }
            };

            retVal.PropertyChangedAction = (source, property, target) =>
            {
                var folder = source as Folder;
                if (folder != null)
                {
                    if (property == "FolderId")
                    {
                        foreach (var subFolder in folder.Subfolders)
                        {
                            subFolder.ParentFolderId = folder.FolderId;
                        }
                        foreach (var folderItem in folder.FolderItems)
                        {
                            folderItem.FolderId = folder.FolderId;
                        }
                    }
                }
            };

            return(retVal);
        }
コード例 #6
0
        public void Can_changetracker_manipulatecollection()
        {
            var tracker = new ObservableChangeTracker();
            var entity  = new TestEntity();

            tracker.Add(entity);
            tracker.Remove(entity);
            tracker.Add(entity);
        }
コード例 #7
0
        protected virtual ObservableChangeTracker GetChangeTracker(IRepository repository)
        {
            var retVal = new ObservableChangeTracker
            {
                RemoveAction = x => repository.Remove(x),
                AddAction    = x => repository.Add(x)
            };

            return(retVal);
        }
コード例 #8
0
        public void SaveCustomerReview(CustomerReview item)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            var pkMap = new PrimaryKeyResolvingMap();

            using (ICustomerReviewRepository repository = _repositoryFactory())
            {
                using (ObservableChangeTracker changeTracker = GetChangeTracker(repository))
                {
                    if (!item.IsTransient())
                    {
                        var sourceEntity = AbstractTypeFactory <CustomerReviewEntity> .TryCreateInstance().FromModel(item, pkMap);

                        var existsEntity = repository.GetCustomerReview(item.Id);
                        if (existsEntity != null)
                        {
                            changeTracker.Attach(existsEntity);
                            sourceEntity.Patch(existsEntity);
                        }
                        else
                        {
                            repository.Add(sourceEntity);
                        }
                    }
                    else
                    {
                        item.Id = Guid.NewGuid().ToString("N");
                        foreach (var value in item.PropertyValues)
                        {
                            value.ReviewId = item.Id;
                        }

                        var sourceEntity = AbstractTypeFactory <CustomerReviewEntity> .TryCreateInstance().FromModel(item, pkMap);

                        repository.Add(sourceEntity);
                    }

                    CommitChanges(repository);
                    pkMap.ResolvePrimaryKeys();
                }
            }
        }
コード例 #9
0
        private ObservableChangeTracker GetChangeTracker(IRepository repository, CustomerOrderEntity customerOrderEntity)
        {
            var retVal = new ObservableChangeTracker
            {
                RemoveAction = (x) =>
                {
                    repository.Remove(x);
                },
                AddAction = (x) =>
                {
                    var address  = x as AddressEntity;
                    var shipment = x as ShipmentEntity;
                    var lineItem = x as LineItemEntity;

                    if (address != null)
                    {
                        address.CustomerOrder = customerOrderEntity;
                    }
                    if (shipment != null)
                    {
                        foreach (var shipmentItem in shipment.Items)
                        {
                            var orderLineItem = customerOrderEntity.Items.FirstOrDefault(item => item.Id == shipmentItem.Id);
                            if (orderLineItem != null)
                            {
                                orderLineItem.Shipment = shipment;
                            }
                            else
                            {
                                shipmentItem.CustomerOrder = customerOrderEntity;
                            }
                        }
                        shipment.Items = new NullCollection <LineItemEntity>();
                    }
                    if (lineItem != null)
                    {
                        lineItem.CustomerOrder   = customerOrderEntity;
                        lineItem.CustomerOrderId = customerOrderEntity.Id;
                    }
                    repository.Add(x);
                }
            };

            return(retVal);
        }
コード例 #10
0
        private ObservableChangeTracker CreateChangeTracker()
        {
            var retVal = new ObservableChangeTracker();

            retVal.KeySelector = (x) =>
            {
                string key = null;
                if (x != null)
                {
                    //old version
                    var propInfo = x.GetType().FindPropertiesWithAttribute(typeof(KeyAttribute)).First();
                    key = String.Format("{0}-{1}", x.GetType(), propInfo.GetValue(x, null));

                    //var propInfo = x.GetType().FindPropertiesWithAttribute(typeof (KeyAttribute)).FirstOrDefault();
                    //if (propInfo != null)
                    //{
                    //    key = String.Format("{0}-{1}", x.GetType(), propInfo.GetValue(x, null));
                    //}
                }
                return(key);
            };

            retVal.AddAction = (x) =>
            {
                var name = ResolveEntitySetName(x);
                AddObject(name, x);
            };

            retVal.AttachAction = (x) =>
            {
                if (GetEntityDescriptor(x) == null)
                {
                    var name = ResolveEntitySetName(x);
                    AttachTo(name, x);
                }
            };

            retVal.DettachAction = (x) =>
            {
                if (GetEntityDescriptor(x) != null)
                {
                    Detach(x);
                }
            };


            retVal.RemoveAction = (x) =>
            {
                DeleteObject(x);
            };

            retVal.UpdateAction = (x) =>
            {
                if (GetEntityDescriptor(x) != null)
                {
                    UpdateObject(x);
                }
            };

            retVal.AttachRelationAction = (source, property, target) =>
                                          AttachRelation(source, property, target);
            retVal.AddNewOneToManyRelationAction = (source, property, target) =>
                                                   AddNewOneToManyRelation(source, property, target);
            retVal.SetManyToOneRelationAction = (source, property, target) =>
            {
                this.SetLink(source, property, target);
            };

            retVal.RemoveManyToOneRelationAction = (source, property, target) =>
            {
                SetLink(source, property, null);
            };
            retVal.RemoveOneToManyRelationAction = (source, property, target) =>
            {
                // this code generates a lot of deletes which should be handled by the cascade deletes instead
                //DeleteLink(source, property, target);

                // mark target object updated, so we can send it to the server and delete it if it can't exist without parent
                //Update(target);
            };

            return(retVal);
        }
 public FileSystemBlobAssetRepository(string storagePath, IAssetEntityFactory assetEntityFactory)
 {
     _storagePath   = storagePath;
     _entityFactory = assetEntityFactory;
     ChangeTracker  = CreateChangeTracker();
 }
コード例 #12
0
 public FileSystemRepository()
 {
     ChangeTracker = CreateChangeTracker();
 }