private static async Task <Tuple <bool, string> > EditOneAsync <T>(this AppDBContext db, DbSet <T> sets, EditType type = EditType.Add, T entity = null, Guid?id = null) where T : ISuper { var title = type.GetTitle(); try { sets.EditDo <T>(type, new List <T> { type != EditType.Remove ? entity : await sets.GetOneAsync <T>(id.Value) }); await db.SaveChangesAsync(); bool check = false; switch (type) { case EditType.Add: check = await sets.Where(i => i == entity).FirstOrDefaultAsync() != null; break; case EditType.Modify: check = await sets.Where(i => i.Id == id).FirstOrDefaultAsync() == entity; break; case EditType.Remove: check = await sets.Where(i => i.Id == id).FirstOrDefaultAsync() == null; break; } return(new Tuple <bool, string>(check, $"{title}{(check ? "成功" : "失败")}!")); } catch (Exception) { return(new Tuple <bool, string>(false, $"{title}失败!")); } }
private static async Task <Tuple <bool, string> > EditManyAsync <T>(this AppDBContext db, DbSet <T> sets, EditType type = EditType.Add, IEnumerable <T> entities = null, IEnumerable <Guid> ids = null, IEnumerable <Tuple <Guid, T> > ids_entities = null) where T : ISuper { var trans = await db.Database.BeginTransactionAsync(); var title = type.GetTitle(); try { List <T> es = new(); switch (type) { case EditType.Add: es = entities.ToList(); break; case EditType.Modify: foreach (var ie in ids_entities) { if ((await sets.GetOneNoTrackingAsync(ie.Item1)) != null) { es.Add(ie.Item2); } } break; case EditType.Remove: es = sets.GetList <T>(i => ids.Contains(i.Id)).ToList(); break; } sets.EditDo <T>(type, es, true); await db.SaveChangesAsync(); List <Guid> success = new(); foreach (var i in es) { switch (type) { case EditType.Add: if ((await sets.Where(j => j == i).FirstOrDefaultAsync()) != null) { success.Add(i.Id); } break; case EditType.Modify: if ((await sets.Where(j => j.Id == i.Id).FirstOrDefaultAsync()) == i) { success.Add(i.Id); } break; case EditType.Remove: if ((await sets.Where(j => j.Id == i.Id).FirstOrDefaultAsync()) == null) { success.Add(i.Id); } break; } } var check = success.Count == (type == EditType.Add ? entities.Count() : (type == EditType.Modify ? ids_entities.Count() : ids.Count())); return(await trans.TransactionAsync(check, $"{title}{(check ? "" : "失败,数据回滚操作")}成功!")); } catch (Exception) { return(await trans.TransactionAsync(false, $"{title}失败,数据回滚操作成功!")); } // catch (Exception e) { return await trans.TransactionAsync(false, e.Message.ToString()); } }