public static bool TryRecordDetailsAdd <TSrc, TSrcD, TDst, TDstD>(this Pinhua2Context context, TSrc src, IEnumerable <TSrcD> srcDSet, Action <TSrcD> Adding = null) where TSrc : _BaseTableMain where TSrcD : _BaseTableDetail where TDst : _BaseTableMain where TDstD : _BaseTableDetail { if (!srcDSet.Any()) { // 如果明细为空,直接返回 true ,避免主表数据无法保存成功 return(true); } foreach (var srcD in srcDSet) { Adding?.Invoke(srcD); srcD.RecordId = src.RecordId; var dstD = StaticAutoMapper.Current.Map <TSrcD, TDstD>(srcD); context.Entry <TDstD>(dstD).State = EntityState.Added; } var nRet = context.SaveChanges(); if (nRet > 0) { return(true); } else { return(false); } }
public static bool TryRecordAdd <TSrc, TDst>(this Pinhua2Context context, TSrc src, Action <TSrc> Adding = null) where TSrc : _BaseTableMain where TDst : _BaseTableMain { Adding?.Invoke(src); src.CreateTime = DateTime.Now; src.CreateUser = src.CreateUser ?? "张凯译"; var dst = StaticAutoMapper.Current.Map <TSrc, TDst>(src); context.Entry <TDst>(dst).State = EntityState.Added; var nret = context.SaveChanges(); if (nret > 0) { // SaveChanges 成功的话,把数据库中的数据比如 RecordId 返回 // src.RecordId = dst.RecordId; StaticAutoMapper.Current.Map <TDst, TSrc>(dst, src); return(true); } else { return(false); } }
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 IActionResult OnPost() { if (!ModelState.IsValid) { return(Page()); } //Common.ModelHelper.CompleteMainOnCreate(vm_地板); //vm_地板.品号 = _context.funcAutoCode("商品号"); //_context.tb_商品表.Add(_mapper.Map<tb_商品表>(vm_地板)); _context.funcNewRecord <vm_商品_地板, tb_商品表>(vm_地板, creating => { creating.品号 = _context.funcAutoCode("商品号"); }); _context.SaveChanges(); return(RedirectToPage("./Index")); }
private IActionResult UpdateOrder <TLocal, TLocalD, TRemote, TRemoteD>(TLocal local, IList <TLocalD> localDetails, Action <TLocal, TLocalD, TRemote, TRemoteD> DoBeforeRemove = null, Action <TLocal, TLocalD, TRemote, TRemoteD> DoBeforeAdd = null) where TRemote : _BaseTableMain where TRemoteD : _BaseTableDetail where TLocal : _BaseTableMain where TLocalD : _BaseTableDetail { var remote = _context.Set <TRemote>().FirstOrDefault(m => m.RecordId == local.RecordId); if (remote == null) { return(NotFound()); } // 非空字段赋值给跟踪实体 //vm_销售订单.往来 = _context.Set<tb_往来表>().AsNoTracking().FirstOrDefault(p => p.往来号 == vm_销售订单.往来号)?.简称; _mapper.Map <TLocal, TRemote>(local, remote); var remoteDetails = _context.Set <TRemoteD>().Where(d => d.RecordId == remote.RecordId).ToList(); // 数据库中的子单号与新明细中没有相同的,则从数据库中删除 foreach (var remoteD in remoteDetails) { if (!localDetails.Any(p => p.子单号 == remoteD.子单号)) { DoBeforeRemove?.Invoke(local, null, null, remoteD); _context.Remove <TRemoteD>(remoteD); } } foreach (var localD in localDetails) { Common.ModelHelper.CompleteDetailOnUpdate(remote, localD); if (remoteDetails.Any(d => d.子单号 == localD.子单号)) // 子单号相同的,表示修改 { var remoteD = _context.Set <TRemoteD>().FirstOrDefault(m => m.子单号 == localD.子单号); _mapper.Map(localD, remoteD); } if (!remoteDetails.Any(d => d.子单号 == localD.子单号)) { if (string.IsNullOrEmpty(localD.子单号)) // 子单号为空的,表示新插入 { DoBeforeAdd?.Invoke(local, localD, null, null); //localD.子单号 = _context.funcAutoCode("子单号"); _context.Attach <TRemoteD>(_mapper.Map <TRemoteD>(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 <TRemoteD>(_mapper.Map <TRemoteD>(localD)).State = EntityState.Added; } } } _context.SaveChanges(); return(RedirectToPage("./Index")); }
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); } }