Example #1
0
        public static IQueryable <TDstD> RecordDetailsEdit <TSrc, TSrcD, TDst, TDstD>(this Pinhua2Context context, TSrc dto, IList <TSrcD> srcDSet,
                                                                                      Action <TSrcD> Adding = null, Action <TSrcD> Updating = null, Action <TDstD> Deleting = null)
            where TSrc : _BaseTableMain
            where TSrcD : _BaseTableDetail
            where TDst : _BaseTableMain
            where TDstD : _BaseTableDetail
        {
            var dst = context.Set <TDst>().AsNoTracking().FirstOrDefault(r => r.RecordId == dto.RecordId);

            if (dst == null)
            {
                return(null);
            }

            var dstDSet = context.Set <TDstD>().Where(d => d.RecordId == dst.RecordId);

            foreach (var DstD in dstDSet)
            {
                if (!srcDSet.Any(p => p.Idx == DstD.Idx)) // 新列表没有数据库中的Idx,则删除
                {
                    Deleting?.Invoke(DstD);
                    context.Remove <TDstD>(DstD);
                }
            }

            foreach (var srcD in srcDSet)
            {
                srcD.RecordId = dst.RecordId;

                if (dstDSet.Any(d => d.Idx == srcD.Idx)) // Idx有相同的,则修改
                {
                    Updating?.Invoke(srcD);

                    // 将删除的重新标记为修改
                    var dstD = dstDSet.FirstOrDefault(m => m.Idx == srcD.Idx);
                    context.Attach <TDstD>(dstD).State = EntityState.Modified;
                    StaticAutoMapper.Current.Map <TSrcD, TDstD>(srcD, dstD);
                }
                else if (!dstDSet.Any(d => d.Idx == srcD.Idx)) // Idx没有相同的,则添加
                {
                    Adding?.Invoke(srcD);
                    var dstD = StaticAutoMapper.Current.Map <TDstD>(srcD);
                    context.Attach <TDstD>(dstD).State = EntityState.Added;
                }
            }

            return(dstDSet);
        }
Example #2
0
        public async Task <IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return(Page());
            }

            _context.Attach(tb_收付表).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!tb_收付表Exists(tb_收付表.RecordId))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(RedirectToPage("./Index"));
        }
Example #3
0
        public async Task <IActionResult> OnPost2Async()
        {
            if (!ModelState.IsValid)
            {
                return(Page());
            }
            var remote = _context.Set <tb_订单表>().FirstOrDefault(m => m.RecordId == vm_Main.RecordId);

            if (remote == null)
            {
                return(NotFound());
            }

            // 非空字段赋值给跟踪实体
            vm_Main.往来 = _context.Set <tb_往来表>().AsNoTracking().FirstOrDefault(p => p.往来号 == vm_Main.往来号)?.简称;
            _mapper.Map <vm_销售订单, tb_订单表>(vm_Main, remote);

            var remoteDetails = _context.Set <tb_订单表D>().Where(d => d.RecordId == remote.RecordId).ToList();

            // 数据库中的子单号与新明细中没有相同的,则从数据库中删除
            foreach (var remoteD in remoteDetails)
            {
                if (!vm_Details.Any(p => p.子单号 == remoteD.子单号))
                {
                    var tb_报价D = _context.Set <tb_报价表D>().FirstOrDefault(d => d.子单号 == remoteD.子单号);
                    if (tb_报价D != null)
                    {
                        tb_报价D.状态 = "";
                    }
                    _context.Remove <tb_订单表D>(remoteD);
                }
            }

            foreach (var localD in vm_Details)
            {
                Common.ModelHelper.CompleteDetailOnUpdate(remote, localD);

                if (remoteDetails.Any(d => d.子单号 == localD.子单号)) // 子单号相同的,表示修改
                {
                    var remoteD = _context.Set <tb_订单表D>().FirstOrDefault(m => m.子单号 == localD.子单号);
                    _mapper.Map(localD, remoteD);
                }
                if (!remoteDetails.Any(d => d.子单号 == localD.子单号))
                {
                    if (string.IsNullOrEmpty(localD.子单号)) // 子单号为空的,表示新插入
                    {
                        localD.子单号 = _context.funcAutoCode("子单号");
                        _context.Attach <tb_订单表D>(_mapper.Map <tb_订单表D>(localD)).State = EntityState.Added;
                    }
                    else if (!string.IsNullOrEmpty(localD.子单号)) // 子单号不为空,表示从报价单引入,插入
                    {
                        var baojiaD = _context.Set <tb_报价表D>().FirstOrDefault(d => d.子单号 == localD.子单号);
                        if (baojiaD != null)
                        {
                            baojiaD.状态 = "已下单";
                        }
                        _context.Attach <tb_订单表D>(_mapper.Map <tb_订单表D>(localD)).State = EntityState.Added;
                    }
                }
            }

            // 数据库中的子单号与新明细中没有相同的,则从数据库中删除
            // 新明细中的子单号为空,则添加
            // 子单号相同,则赋值

            await _context.SaveChangesAsync();

            return(RedirectToPage("./Index"));
        }
        public static IQueryable <TRemoteD> funcEditDetails <TLocal, TLocalD, TRemote, TRemoteD>(this Pinhua2Context context, TLocal _local, IList <TLocalD> _localDs,/*TRemote remote, IList<TRemoteD> _remoteDs,*/
                                                                                                 Action <TLocalD> CreatingD = null, Action <TLocalD> UpdatingD = null, Action <TRemoteD> DeletingD = null)
            where TLocal : _BaseTableMain
            where TLocalD : _BaseTableDetail
            where TRemote : _BaseTableMain
            where TRemoteD : _BaseTableDetail
        {
            var remote = context.Set <TRemote>().AsNoTracking().FirstOrDefault(r => r.RecordId == _local.RecordId);

            if (remote == null)
            {
                return(null);
            }

            var remoteDs = context.Set <TRemoteD>().Where(d => d.RecordId == remote.RecordId);

            foreach (var remoteD in remoteDs)
            {
                if (!_localDs.Any(p => p.Idx == remoteD.Idx)) // 新列表没有数据库中的Idx,则删除
                //if (!_localDs.Any(p => p.子单号  == remoteD.子单号)) // 新列表没有数据库中的Idx,则删除
                {
                    #region 应该在外部执行
                    //var tb_报价D = context.Set<tb_报价表D>().FirstOrDefault(d => d.Idx == remoteD.Idx);
                    //if (tb_报价D != null)
                    //    tb_报价D.状态 = "";
                    #endregion

                    DeletingD?.Invoke(remoteD);
                    context.Remove <TRemoteD>(remoteD);
                }
            }

            foreach (var localD in _localDs)
            {
                //Pinhua2Helper.CompleteDetailOnUpdate(remote, localD);
                localD.RecordId = remote.RecordId;

                if (remoteDs.Any(d => d.Idx == localD.Idx)) // Idx有相同的,则修改
                //if (remoteDs.Any(d => d.子单号 == localD.子单号)) // Idx有相同的,则修改
                {
                    UpdatingD?.Invoke(localD);

                    // 将删除的重新标记为修改
                    var remoteD = remoteDs.FirstOrDefault(m => m.Idx == localD.Idx);
                    context.Attach <TRemoteD>(remoteD).State = EntityState.Modified;
                    Mapper.Map <TLocalD, TRemoteD>(localD, remoteD);
                }
                else if (!remoteDs.Any(d => d.Idx == localD.Idx)) // Idx没有相同的,则添加
                //else if (!remoteDs.Any(d => d.子单号 == localD.子单号)) // Idx没有相同的,则添加
                {
                    CreatingD?.Invoke(localD);
                    #region 应该在外部执行
                    // 将新的标记为添加
                    //if (string.IsNullOrEmpty(localD.Idx)) // Idx为空的,表示新插入
                    //{
                    //    //localD.Idx = context.funcAutoCode("Idx");
                    //    var remoteD = Mapper.Map<TRemoteD>(localD);
                    //    context.Entry<TRemoteD>(remoteD).State = EntityState.Added;
                    //}
                    //else if (!string.IsNullOrEmpty(localD.Idx)) // Idx不为空,表示从报价单引入,插入
                    //{
                    //    var remoteD = Mapper.Map<TRemoteD>(localD);
                    //    context.Entry<TRemoteD>(remoteD).State = EntityState.Added;
                    //}
                    #endregion
                    var remoteD = Mapper.Map <TRemoteD>(localD);
                    context.Attach <TRemoteD>(remoteD).State = EntityState.Added;
                }
            }

            return(remoteDs);
        }
Example #5
0
        public static bool TryRecordDetailsEdit <TSrc, TSrcD, TDst, TDstD>(this Pinhua2Context context, TSrc dto, IEnumerable <TSrcD> srcDSet,
                                                                           /*out IEnumerable<TDstD> outDstDSet,*/ Action <TSrcD> Adding = null, Action <TSrcD> Updating = null, Action <TDstD> Deleting = null)
            where TSrc : _BaseTableMain
            where TSrcD : _BaseTableDetail
            where TDst : _BaseTableMain
            where TDstD : _BaseTableDetail
        {
            var dst = context.Set <TDst>().AsNoTracking().FirstOrDefault(r => r.RecordId == dto.RecordId);

            if (dst == null)
            {
                //outDstDSet = null;
                return(false);
            }

            var dstDSet = context.Set <TDstD>().Where(d => d.RecordId == dst.RecordId);

            // 如果本地明细和数据库明细都是空的,说明明细表没有任何改变,直接返回 true
            if (!srcDSet.Any() && !dstDSet.Any())
            {
                //outDstDSet = dstDSet;
                return(true);
            }

            foreach (var DstD in dstDSet)
            {
                if (!srcDSet.Any(p => p.Idx == DstD.Idx)) // 新列表没有数据库中的Idx,则删除
                {
                    Deleting?.Invoke(DstD);
                    context.Remove <TDstD>(DstD);
                }
            }

            foreach (var srcD in srcDSet)
            {
                srcD.RecordId = dst.RecordId;

                if (dstDSet.Any(d => d.Idx == srcD.Idx)) // Idx有相同的,则修改
                {
                    Updating?.Invoke(srcD);

                    // 将删除的重新标记为修改
                    var dstD = dstDSet.FirstOrDefault(m => m.Idx == srcD.Idx);
                    context.Attach <TDstD>(dstD).State = EntityState.Modified;
                    StaticAutoMapper.Current.Map <TSrcD, TDstD>(srcD, dstD);
                }
                else if (!dstDSet.Any(d => d.Idx == srcD.Idx)) // Idx没有相同的,则添加
                {
                    Adding?.Invoke(srcD);
                    var dstD = StaticAutoMapper.Current.Map <TDstD>(srcD);
                    context.Attach <TDstD>(dstD).State = EntityState.Added;
                }
            }

            if (context.SaveChanges() > 0)
            {
                //outDstDSet = dstDSet.AsEnumerable<TDstD>();
                return(true);
            }
            else
            {
                //outDstDSet = null;
                return(false);
            }
        }