public void UpdateValues <T, TKey>(List <T> getExistLists, List <T> getNowLists, Func <T, TKey> getCompareKey, Func <T, T, bool> getKey) where T : EntityBase { var entityDiff = new EntityDiff <T, TKey>(getExistLists, getNowLists, getCompareKey); entityDiff.DeletedEntities.ForEach(p => UpdateEntityState(p, EntityState.Deleted)); getExistLists.AddRange(entityDiff.AddedEntities); foreach (var modEntity in entityDiff.ModifiedEntities) { var oldEntity = getExistLists.Where(p => getKey(modEntity, p)).FirstOrDefault(); UpdateEntityValues(oldEntity, modEntity); } }
/// <summary> /// 更新1对多关系的实体值 /// </summary> ///<param name="existEntity">数据库存在的实体</param> ///<param name="nowEntity">当前存在的实体</param> ///<param name="getChilds">获取1对多关系的实体回调</param> ///<param name="getCompareKey">实体差异比较条件回调</param> ///<param name="getKey">实体更新获取数据库实体的条件回调</param> /// <returns>VOID/returns> public void UpdateValues <T, T1, TKey>(T existEntity, T nowEntity, Func <T, List <T1> > getChilds, Func <T1, TKey> getCompareKey, Func <T1, T1, bool> getKey) where T : EntityBase where T1 : EntityBase { UpdateEntityValues(existEntity, nowEntity); var entityDiff = new EntityDiff <T1, TKey>(getChilds(existEntity), getChilds(nowEntity), getCompareKey); entityDiff.DeletedEntities.ForEach(p => UpdateEntityState(p, EntityState.Deleted)); getChilds(existEntity).AddRange(entityDiff.AddedEntities); foreach (var modEntity in entityDiff.ModifiedEntities) { var oldEntity = getChilds(existEntity).Where(p => getKey(modEntity, p)).FirstOrDefault(); UpdateEntityValues(oldEntity, modEntity); } }
/// <summary> /// </summary> /// <returns></returns> public void UpdateNodeValues <T, TKey>(T existNode, T nowNode, Func <T, List <T> > getChilds, Func <T, TKey> getCompareKey, Func <T, T, bool> getEntityKey, Func <T, T> getNewNode, Action <T, T> getConfig) where T : EntityBase { UpdateEntityValues(existNode, nowNode); var entityDiff = new EntityDiff <T, TKey>(getChilds(existNode), getChilds(nowNode), getCompareKey); //删除 entityDiff.DeletedEntities.ForEach(node => DeleteNode(node, getChilds)); //新增 entityDiff.AddedEntities.ForEach(node => { var newChildNode = getNewNode(existNode); // getConfig(newChildNode, node); InsertEntity(newChildNode); getChilds(existNode).Add(newChildNode); AddNodeValues(newChildNode, node, getChilds, getNewNode, getConfig); }); //更新 entityDiff.ModifiedEntities.ForEach(modNode => { var existEntity = getChilds(existNode).Where(n => getEntityKey(modNode, n)).FirstOrDefault(); UpdateNodeValues(existEntity, modNode, getChilds, getCompareKey, getEntityKey, getNewNode, getConfig); }); }