/// <summary> /// ctor /// </summary> /// <param name="innerDataProvider"></param> public ModelDataService(EFAuditDataService <TEntity> innerDataProvider) { _innerDataProvider = innerDataProvider; _dataMapper = new LangDataMapper <TModel, TEntity>(); _entityRule = ModelRule.Get <TEntity>(); _modelRule = ModelRule.Get <TModel>(); }
/// <summary> /// 返回业务模型对象全部的结果查询表达式 /// </summary> /// <returns></returns> public virtual IQueryable <TModel> GetQuery() { IQueryable <TEntity> query = _innerDataProvider.GetQuery(); if (typeof(MultiLanguage).IsAssignableFrom(typeof(TEntity))) { query = query.Include("LangTexts"); } //如果实现逻辑删除接口,并且没有改写EFAuditDataSerice,则在此加条件 if (typeof(ICanLogicalDeleteEntity).IsAssignableFrom(typeof(TEntity)) && _innerDataProvider.GetType() == typeof(EFAuditDataService <TEntity>)) { query = query.Where("IsDeleted=false"); } if (typeof(IDataRule).IsAssignableFrom(typeof(TEntity))) { var context = _innerDataProvider.GetContext(); var userId = AppManager.Instance.GetCurrentUserId().ToInt(); query = query.Where(t => context.Set <Sys_DataRule>().Any(dr => dr.BillId == t.Id && dr.ObjectId == userId)); } var langMapper = new LangDataMapper <TModel, TEntity>(); var duQuery = new DeptUserAuthQuery <TModel>(); return(duQuery.GetQuery(query.ProjectTo <TModel>())); }
/// <summary> /// 批量处理数据对象中的非强关联集合数据, 此方法被反射调用 /// </summary> /// <typeparam name="TItemModel">业务对象中的集合元素类型</typeparam> /// <typeparam name="TItemEntity">数据对象中的集合元素类型</typeparam> /// <param name="model">业务对象</param> /// <param name="data">数据对象</param> protected void ProcessAttachmentCollection <TItemModel, TItemEntity>(TModel model, TEntity data) where TItemModel : class, IId <int> where TItemEntity : class, IAttachmentEntity { ICollection <TItemEntity> dataItemCollection = _entityRule.GetCollectionValue <TItemEntity>(data) as ICollection <TItemEntity>; ICollection <TItemModel> modelItemList = _modelRule.GetCollectionValue <TItemModel>(model) as ICollection <TItemModel>; //重新从数据库中加载原有集合以和现有集合进行比对 var oldModelItemList = GetAttachmentCollection <TItemModel, TItemEntity>(model.Id); var itemMapper = new LangDataMapper <TItemModel, TItemEntity>(); //将新集合与已有集合进行比对,凡不在新集合中的原有集合ID所指对象代表已经被删除 var deletedItemIds = oldModelItemList.Select(m => m.Id).Except(modelItemList.Select(m => m.Id)); var deletedItems = oldModelItemList.Where(m => deletedItemIds.Contains(m.Id)); foreach (var modelItem in deletedItems) { var entityItem = itemMapper.ToEntity(modelItem); var logicalDeleteItem = entityItem as ICanLogicalDeleteEntity; if (logicalDeleteItem != null) { logicalDeleteItem.IsDeleted = true; MarkState(entityItem, EntityState.Modified); } else { MarkState(entityItem, EntityState.Deleted); } } //判断业务模型的子表哪些数据是新增/修改或删除的,转换成数据实体子项后,对其加上对应的EF标记 foreach (var modelItem in modelItemList) { var entityItem = itemMapper.ToEntity(modelItem); entityItem.BillId = data.Id; entityItem.ModuleCode = typeof(TEntity).Name; if (entityItem.Id == 0) { dataItemCollection.Add(entityItem); MarkState(entityItem, EntityState.Added); } else { var oldModelItem = oldModelItemList.FirstOrDefault(item => item.Id == modelItem.Id); // 与原有ID相同的对象比较,如果内容不同说明已经被修改 if (CompareChanged(modelItem, oldModelItem)) { MarkState(entityItem, EntityState.Modified); } } } }
/// <summary> /// 获取强主外键关联的子表对象集合 /// </summary> /// <typeparam name="TItemModel">子表的业务模型类</typeparam> /// <typeparam name="TItemEntity">子表的数据模型类</typeparam> /// <param name="modelId">主表ID</param> /// <returns>子表集合</returns> protected List <TItemModel> GetCollection <TItemModel, TItemEntity>(int modelId) where TItemModel : class, IId <int> where TItemEntity : class, IDetailEntity { using (var service = SiteManager.Get <EFAuditDataService <TItemEntity> >()) { var list = service.GetQuery().Where(item => item.MasterId == modelId); if (typeof(ICanLogicalDeleteEntity).IsAssignableFrom(typeof(TItemEntity))) { list = list.Where("IsDeleted=False"); } var langMapper = new LangDataMapper <TItemModel, TItemEntity>(); return(list.ProjectTo <TItemModel>().ToList()); } }