Ejemplo n.º 1
0
 /// <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>();
 }
Ejemplo n.º 2
0
        /// <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>()));
        }
Ejemplo n.º 3
0
        /// <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);
                    }
                }
            }
        }
Ejemplo n.º 4
0
 /// <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());
     }
 }