/// <summary> /// 获取指定类型的仓储 /// </summary> /// <param name="type"></param> /// <returns></returns> private IRepository FindRepository(Type type) { if (_repositoriesCache.ContainsKey(type.FullName)) { return(_repositoriesCache[type.FullName]); } var repository = RepositoryFacade.Find(type); _repositoriesCache[type.FullName] = repository; return(repository); }
/// <summary> /// 执行数据归档。 /// </summary> /// <param name="context">表示数据归档的上下文。</param> public void Archive(AggregationArchiveContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } _orignalDataDbSettingName = context.OrignalDataDbSettingName; _backUpDbSettingName = context.BackUpDbSettingName; var updatedTimeCondition = new PropertyMatch(EntityStampExtension.UpdatedTimeProperty, PropertyOperator.LessEqual, context.DateOfArchiving); bool needProgress = this.ProgressChanged != null; if (needProgress) { this.OnProgressChanged("-------------- 开始数据归档 --------------"); } using (StampContext.DisableAutoSetStamps()) { foreach (var item in context.ItemsToArchive) { var aggtRootType = item.AggregationRoot; var archiveType = item.ArchiveType; if (archiveType == ArchiveType.Copy) { throw new NotSupportedException("Copy 操作暂不支持。"); } var repository = RepositoryFacade.Find(aggtRootType); #region 查询本次需要归档的总数据行数。 long totalCount = 0; if (needProgress) { totalCount = repository.CountBy(new CommonQueryCriteria { updatedTimeCondition }); this.OnProgressChanged($"目前,共有 {totalCount} 个聚合根 {aggtRootType.FullName} 需要归档。"); } #endregion #region 构造一个查完整聚合的条件对象 CommonQueryCriteria //设置 EagerLoadOptions,加载整个聚合。 var criteria = new CommonQueryCriteria() { updatedTimeCondition }; criteria.PagingInfo = new PagingInfo(1, context.BatchSize); var eagerLoadOptions = new EagerLoadOptions(); EagerLoadAggregationRecur(eagerLoadOptions, repository.EntityMeta); if (repository.SupportTree) { eagerLoadOptions.LoadWithTreeChildren(); } criteria.EagerLoad = eagerLoadOptions; #endregion //逐页迁移历史数据表。 var currentProcess = 0; while (true) { //获取最新的一页的数据。 var entitiesToMigrate = repository.GetBy(criteria); var count = entitiesToMigrate.Count; if (count == 0) { break; } using (var tranOriginal = RF.TransactionScope(_orignalDataDbSettingName)) using (var tranBackup = RF.TransactionScope(_backUpDbSettingName)) { //迁移到历史表。 this.BackupToHistory(repository, entitiesToMigrate); //实体删除 this.DeleteOriginalData(repository, entitiesToMigrate); //备份完成,才能同时提交两个库的事务。 tranOriginal.Complete(); tranBackup.Complete(); } currentProcess += count; if (needProgress) { this.OnProgressChanged($" 处理进度", decimal.Round(currentProcess / totalCount * 100, 2)); } } } } if (needProgress) { this.OnProgressChanged("-------------- 结束数据归档 --------------"); } }