public async Task <IActionResult> OnPostAsync() { if (!ModelState.IsValid) { return(Page()); } var remote = _context.funcEditRecord <vm_销售出库, tb_IO>(vm_Main, BeforeNew: before => { // 非空字段赋值给跟踪实体 before.类型 = "销售出库"; before.往来 = _context.Set <tb_往来表>().FirstOrDefault(p => p.往来号 == vm_Main.往来号)?.简称; }); _context.funcEditDetails <vm_销售出库, vm_销售出库D, tb_IO, tb_IOD>(vm_Main, vm_Details, creatingD => { if (string.IsNullOrEmpty(creatingD.子单号)) // 子单号为空的,表示新插入 { creatingD.子单号 = _context.funcAutoCode("子单号"); } else if (!string.IsNullOrEmpty(creatingD.子单号)) // 子单号不为空,表示从报价单引入,插入 { var baojiaD = _context.Set <tb_订单表D>().FirstOrDefault(d => d.子单号 == creatingD.子单号); if (baojiaD != null) { baojiaD.状态 = "已出库"; } } }, updatingD => { var baojiaD = _context.Set <tb_订单表D>().FirstOrDefault(d => d.子单号 == updatingD.子单号); if (baojiaD != null) { baojiaD.状态 = "已出库"; } }, deletingD => { var tb_报价D = _context.Set <tb_订单表D>().FirstOrDefault(d => d.子单号 == deletingD.子单号); if (tb_报价D != null) { tb_报价D.状态 = ""; } }); await _context.SaveChangesAsync(); return(RedirectToPage("./Index")); }
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 static TRemote funcEditRecord <TLocal, TRemote>(this Pinhua2Context context, TLocal local, Action <TLocal> BeforeNew = null /*, Action<TRemote> AfterNew = null*/) where TLocal : _BaseTableMain where TRemote : _BaseTableMain { var remote = context.Set <TRemote>().FirstOrDefault(m => m.RecordId == local.RecordId); if (remote == null) { return(null); } BeforeNew?.Invoke(local); //Pinhua2Helper.CompleteMainOnEdit(local); local.CreateTime = remote.CreateTime; local.CreateUser = remote.CreateUser; local.LastEditTime = DateTime.Now; local.LastEditUser = local.LastEditUser ?? "张凯译"; Mapper.Map <TLocal, TRemote>(local, remote); context.Entry <TRemote>(remote).State = EntityState.Modified; //AfterNew?.Invoke(remote); //context.SaveChanges(); return(remote); }
public static bool TryRecordEdit <TSrc, TDst>(this Pinhua2Context context, TSrc src, /*out TDst outDst,*/ Action <TSrc> Editing = null) where TSrc : _BaseTableMain where TDst : _BaseTableMain { var dst = context.Set <TDst>().FirstOrDefault(m => m.RecordId == src.RecordId); if (dst == null) { //outDst = null; return(false); } Editing?.Invoke(src); src.CreateTime = dst.CreateTime; src.CreateUser = dst.CreateUser; src.LastEditTime = DateTime.Now; src.LastEditUser = src.LastEditUser ?? "张凯译"; StaticAutoMapper.Current.Map <TSrc, TDst>(src, dst); context.Entry <TDst>(dst).State = EntityState.Modified; var ret = context.SaveChanges(); if (ret > 0) { //outDst = dst; return(true); } else { //outDst = null; return(false); } }
public static TDst RecordEdit <TSrc, TDst>(this Pinhua2Context context, TSrc src, Action <TSrc> Editing = null /*, Action<TRemote> AfterNew = null*/) where TSrc : _BaseTableMain where TDst : _BaseTableMain { var dst = context.Set <TDst>().FirstOrDefault(m => m.RecordId == src.RecordId); if (dst == null) { return(null); } Editing?.Invoke(src); src.CreateTime = dst.CreateTime; src.CreateUser = dst.CreateUser; src.LastEditTime = DateTime.Now; src.LastEditUser = src.LastEditUser ?? "张凯译"; StaticAutoMapper.Current.Map <TSrc, TDst>(src, dst); context.Entry <TDst>(dst).State = EntityState.Modified; context.SaveChanges(); return(dst); }
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); } }