Пример #1
0
        public void SetResult(SyncResultBase <SyncModel> result)
        {
            var tName = result.Name;

            results.Add(tName, result);
            TablesToSync[tName] = result.CurrentVersion;
        }
Пример #2
0
        private void SyncDb(bool updateVersions)
        {
            var adapterLocator = new AdapterLocator(ServiceLocatorMaster, ServiceLocatorSchool
                                                    , context.GetSyncResult <Gender>().All
                                                    , context.GetSyncResult <SpEdStatus>().All);

            List <SyncModelWrapper> models = new List <SyncModelWrapper>();

            foreach (var type in context.Types)
            {
                var fkProps = new List <PropertyInfo>();
                var flag    = BindingFlags.Instance | BindingFlags.Public;
                var props   = type.Value.GetProperties(flag);
                foreach (var propertyInfo in props)
                {
                    if (propertyInfo.CanRead && propertyInfo.CanWrite && propertyInfo.GetCustomAttribute <NullableForeignKey>() != null)
                    {
                        fkProps.Add(propertyInfo);
                    }
                }

                SyncResultBase <SyncModel> sr = context.GetSyncResult(type.Value);
                foreach (var syncModel in sr.All)
                {
                    if (syncModel.SYS_CHANGE_VERSION == syncModel.SYS_CHANGE_CREATION_VERSION || fkProps.Count == 0)
                    {
                        models.Add(SyncModelWrapper.Create(syncModel.SYS_CHANGE_CREATION_VERSION ?? syncModel.SYS_CHANGE_VERSION, PersistOperationType.Insert, syncModel));
                    }
                    else
                    {
                        var iModel = syncModel.Clone();
                        foreach (var propertyInfo in fkProps)
                        {
                            propertyInfo.SetValue(iModel, null);
                        }
                        models.Add(SyncModelWrapper.Create(syncModel.SYS_CHANGE_CREATION_VERSION, PersistOperationType.Insert, iModel));
                        models.Add(SyncModelWrapper.Create(syncModel.SYS_CHANGE_VERSION, PersistOperationType.Update, syncModel));
                    }
                }

                if (sr.Updated != null)
                {
                    models.AddRange(sr.Updated.Select(x => SyncModelWrapper.Create(x.SYS_CHANGE_VERSION, PersistOperationType.Update, x)));
                }
                if (sr.Deleted != null)
                {
                    foreach (var syncModel in sr.Deleted)
                    {
                        models.Add(SyncModelWrapper.Create(syncModel.SYS_CHANGE_VERSION, PersistOperationType.Delete, syncModel));
                        if (fkProps.Count != 0)
                        {
                            models.Add(SyncModelWrapper.Create(0, PersistOperationType.PrepareToDelete, syncModel));
                        }
                    }
                }
            }
            models.Sort();
            IList <SyncModelWrapper> batch = new List <SyncModelWrapper>();

            for (int i = 0; i < models.Count; i++)
            {
                if (i > 0 && (models[i].Model.GetType().Name != models[i - 1].Model.GetType().Name || models[i].OperationType != models[i - 1].OperationType))
                {
                    Persist(adapterLocator.GetAdapter(batch[0].Model.GetType()), batch[0].OperationType,
                            batch.Select(x => x.Model).ToList());
                    batch.Clear();
                }
                batch.Add(models[i]);
            }
            Persist(adapterLocator.GetAdapter(batch[0].Model.GetType()), batch[0].OperationType,
                    batch.Select(x => x.Model).ToList());

            insertedUsers = adapterLocator.InsertedUserIds;

            if (updateVersions)
            {
                Log.LogInfo("update versions");
                UpdateVersion();
            }
        }