You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

小型时间追踪程序用户删除功能异常(_id变量相关问题求助)

问题分析与修复方案

核心问题

你的删除功能失效本质是**_id变量未被正确赋值**,同时代码里还有几处逻辑冗余和不合理的地方:

  1. _id未传递:在btnDelete_Click中创建MitarbeiterTasks实例时,没有将需要删除的用户ID传入类中,导致_id是空值或默认值,自然匹配不到目标用户。
  2. 冗余代码无效:DeleteUserAction里的Type type = typeof(DatabaseContext);和FieldInfo fieldInfo = type.GetField("Users");完全没用到,属于无效代码。
  3. 重复并发任务:RunTaskByAction里启动4个完全相同的删除任务,会导致并发冲突(比如第一个任务删完用户后,后面的任务执行Single会抛出找不到用户的异常),完全没必要。
  4. 上下文管理混乱:你忽略了RunTaskByAction传入的obj参数,自己直接new了DatabaseContext,既浪费资源又可能导致上下文不一致。

具体修复步骤

1. 给MitarbeiterTasks类添加用户ID参数

修改类的构造函数,确保要删除的用户ID能被正确传递并存储:

private readonly int _userId;
private readonly DbController _dbController;

// 调整构造函数,接收要删除的用户ID
public MitarbeiterTasks(DatabaseContext context, DbController dbController, int userId)
{
    _dbController = dbController;
    _userId = userId;
}

2. 简化并修复DeleteUserAction逻辑

去掉无效代码,用SingleOrDefault避免异常,同时用using确保数据库上下文被正确释放:

Action<object> DeleteUserAction = (object obj) =>
{
    using (var context_ = new DatabaseContext())
    {
        // 先查找用户,找不到返回null,避免抛出异常
        var targetUser = context_.Users.SingleOrDefault(u => u.ID == _userId);
        if (targetUser != null)
        {
            context_.Users.Remove(targetUser);
            context_.SaveChanges();
        }
    }
};

public void DeleteUser()
{
    _dbController.RunTaskByAction(DeleteUserAction);
}

3. 修正RunTaskByAction的任务逻辑

只需要启动一个任务执行删除操作,避免并发冲突:

public void RunTaskByAction(Action<object> action_)
{
    // 用Task.Run更简洁,也可以保留原Task创建方式,但只开一个
    Task.Run(() => action_("DatabaseContext"));
}

4. 在GUI点击事件中传递用户ID

从你的GUI控件(比如选中的列表项、输入框)获取要删除的用户ID,再传入MitarbeiterTasks:

private void btnDelete_Click(object sender, EventArgs e)
{
    // 示例:假设从选中的列表项获取用户ID,根据你的实际GUI逻辑调整
    int targetUserId = GetSelectedUserId(); 
    Tasks.MitarbeiterTasks MTasks = new Tasks.MitarbeiterTasks(context, dBController, targetUserId);
    MTasks.DeleteUser();
}

// 自己实现这个方法,从GUI获取选中用户的ID
private int GetSelectedUserId()
{
    // 比如从ListView选中项的Tag属性获取ID
    if (listViewUsers.SelectedItems.Count > 0)
    {
        return (int)listViewUsers.SelectedItems[0].Tag;
    }
    // 没有选中的话可以抛出异常或返回无效值,根据需求处理
    throw new InvalidOperationException("请先选中要删除的用户");
}

额外注意事项

  • 数据库操作建议使用异步方法(比如SingleOrDefaultAsync、SaveChangesAsync),避免阻塞GUI线程。
  • 如果需要多线程操作数据库,要注意并发冲突问题,可以考虑加锁或者用EF的乐观并发机制。
  • 尽量统一数据库上下文的管理,不要在多个地方随意new上下文,最好由DbController提供已初始化的上下文实例。

内容的提问来源于stack exchange,提问作者Christian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:54:22