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); }
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")); }
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); }
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); } }