批量修改、批量删除,我怎么重写这2个接口

发布于 2020-03-07 16:54:47

我现在要对一个表写一个详细的操作日志表,对这个表执行新增、修改、删除、批量修改、批量操作的时候,都要记录下来。 新增、修改、删除这3个操作我可以在VM中重写接口,把日志存好。 批量修改、批量操作的时候要怎么重写这2个接口?我在BatchVM 中加 public override void DoBatchDelete() 想重写这个接口,写不了。

查看更多

关注者
0
被浏览
416
2 个回答
itteacher
itteacher 2020-03-07

参考一下源码吧`
/// <summary>

    /// 批量删除,默认对Ids中包含的主键的数据进行删除。子类如果有特殊判断应重载本函数
    /// </summary>
    /// <returns>true代表成功,false代表失败</returns>
    public virtual bool DoBatchDelete()
    {
        bool rv = true;
        //循环所有数据Id
        List<string> idsData = Ids.ToList();
        for (int i = 0; i < idsData.Count; i++)
        {
            string checkErro = null;
            //检查是否可以删除,如不能删除则直接跳过
            if (CheckIfCanDelete(idsData[i], out checkErro) == false)
            {
                ErrorMessage.Add(idsData[i], checkErro);
                rv = false;
                break;
            }
            //进行删除
            try
            {
                var ctor = typeof(TModel).GetConstructor(Type.EmptyTypes);
                if (typeof(TModel).IsSubclassOf(typeof(PersistPoco)))
                {
                    var pp = DC.Set<TModel>().CheckID(idsData[i]).FirstOrDefault();
                    (pp as PersistPoco).IsValid = false;
                    (pp as PersistPoco).UpdateTime = DateTime.Now;
                    (pp as PersistPoco).UpdateBy = LoginUserInfo.ITCode;
                    DC.UpdateProperty(pp, "IsValid");
                    DC.UpdateProperty(pp, "UpdateTime");
                    DC.UpdateProperty(pp, "UpdateBy");
                }
                else
                {
                    TModel m = ctor.Invoke(null) as TModel;

                    m.SetPropertyValue("ID", idsData[i]);
                    DC.Set<TModel>().Attach(m);
                    DC.DeleteEntity(m);
                }
            }
            catch (Exception e)
            {
                SetExceptionMessage(e, idsData[i]);
                rv = false;
            }
        }
        //进行数据库的删除操作
        if (rv == true)
        {
            try
            {
                DC.SaveChanges();
            }
            catch (Exception e)
            {
                SetExceptionMessage(e, null);
                rv = false;
            }
        }
        //如果失败,添加错误信息
        if (rv == false)
        {
            if (ErrorMessage.Count > 0)
            {
                foreach (var id in idsData)
                {
                    if (!ErrorMessage.ContainsKey(id))
                    {
                        ErrorMessage.Add(id, Program._localizer["Rollback"]);
                    }
                }
            }
            ListVM?.DoSearch();
            if (ListVM != null)
            {
                foreach (var item in ListVM?.GetEntityList())
                {
                    item.BatchError = ErrorMessage.Where(x => x.Key == item.GetID().ToString()).Select(x => x.Value).FirstOrDefault();
                }
            }
            MSD.AddModelError("", Program._localizer["DataCannotDelete"]);
        }
        return rv;
    }


    /// <summary>
    /// 批量修改,默认对Ids中包含的数据进行修改,子类如果有特殊判断应重载本函数
    /// </summary>
    /// <returns>true代表成功,false代表失败</returns>
    public virtual bool DoBatchEdit()
    {
        //获取批量修改VM的所有属性
        var pros = LinkedVM.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.DeclaredOnly);
        bool rv = true;
        List<string> idsData = Ids.ToList();
        //找到对应的BaseCRUDVM,并初始化
        var vmtype = this.GetType().Assembly.GetExportedTypes().Where(x => x.IsSubclassOf(typeof(BaseCRUDVM<TModel>))).FirstOrDefault();
        IBaseCRUDVM<TModel> vm = null;
        if (vmtype != null)
        {
            vm = vmtype.GetConstructor(System.Type.EmptyTypes).Invoke(null) as IBaseCRUDVM<TModel>;
            vm.CopyContext(this);
        }
        //循环所有数据
        for (int i = 0; i < idsData.Count; i++)
        {
            try
            {
                //如果找不到对应数据,则输出错误
                TModel entity = null;
                entity = DC.Set<TModel>().CheckID(idsData[i]).FirstOrDefault();
                if (vm != null)
                {
                    vm.SetEntity(entity);
                }
                if (entity == null)
                {
                    ErrorMessage.Add(idsData[i], Program._localizer["DataNotExist"]);
                    rv = false;
                    break;
                }
                //如果能找到,则循环LinkedVM中的属性,给entity中同名属性赋值
                foreach (var pro in pros)
                {
                    var proToSet = entity.GetType().GetProperty(pro.Name);
                    var val = FC.ContainsKey("LinkedVM." + pro.Name) ? FC["LinkedVM." + pro.Name] : null;
                    if (proToSet != null && val != null)
                    {
                        var hasvalue = true;
                        if ( val is StringValues sv && StringValues.IsNullOrEmpty(sv) == true)
                        {
                            hasvalue = false;
                        }
                        if (hasvalue)
                        {
                            proToSet.SetValue(entity, pro.GetValue(LinkedVM));
                        }
                    }
                }

                //调用controller方法验证model
                try
                {
                    Controller.GetType().GetMethod("RedoValidation").Invoke(Controller, new object[] { entity });
                }
                catch { }
                //如果有对应的BaseCRUDVM则使用其进行数据验证
                if (vm != null)
                {
                    vm.Validate();
                    var errors = vm.MSD;
                    if (errors != null && errors.Count > 0)
                    {
                        var error = "";
                        foreach (var key in errors.Keys)
                        {
                            if (errors[key].Count > 0)
                            {
                                error += errors[key].Select(x => x.ErrorMessage).ToSpratedString();
                            }
                        }
                        if (error != "")
                        {
                            ErrorMessage.Add(idsData[i], error);
                            rv = false;
                            break;
                        }
                    }
                }
                if (typeof(TModel).IsSubclassOf(typeof(BasePoco)))
                {
                    BasePoco ent = entity as BasePoco;
                    if (ent.UpdateTime == null)
                    {
                        ent.UpdateTime = DateTime.Now;
                    }
                    if (string.IsNullOrEmpty(ent.UpdateBy))
                    {
                        ent.UpdateBy = LoginUserInfo?.ITCode;
                    }
                }
                DC.UpdateEntity(entity);
            }
            catch (Exception e)
            {
                SetExceptionMessage(e, idsData[i]);
                rv = false;
            }
        }
        //进行数据库的修改操作
        if (rv == true)
        {
            try
            {
                DC.SaveChanges();
            }
            catch (Exception e)
            {
                SetExceptionMessage(e, null);
                rv = false;
            }
        }

        //如果有错误,输出错误信息
        if (rv == false)
        {
            if (ErrorMessage.Count > 0)
            {
                foreach (var id in idsData)
                {
                    if (!ErrorMessage.ContainsKey(id))
                    {
                        ErrorMessage.Add(id, Program._localizer["Rollback"]);
                    }
                }
            }
            ListVM.DoSearch();
            foreach (var item in ListVM.GetEntityList())
            {
                item.BatchError = ErrorMessage.Where(x => x.Key == item.GetID().ToString()).Select(x => x.Value).FirstOrDefault();
            }
        }
        return rv;
    }`
zhaohl2045
zhaohl2045 2020-03-08
问君能有几多愁,恰似一群太监上青楼。

我理解,你这个就是添加一个日志操作,你写一个公共的方法,比如WriteLog(),然后你不用重写任何数据,直接在Controller中,添加到方法后面就好了,比如新增操作,VM.DoAdd(); CommonVM.WriteLog();批量修改和批量删除,你都可以写在这些方法后面,如果你想记录详细内容,这些操作都能获取到类的主键ID,你通过主键ID,就可以获取到任何数据。。。。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览