小型时间追踪程序用户删除功能异常(_id变量相关问题求助)
问题分析与修复方案
核心问题
你的删除功能失效本质是**_id变量未被正确赋值**,同时代码里还有几处逻辑冗余和不合理的地方:
_id未传递:在btnDelete_Click中创建MitarbeiterTasks实例时,没有将需要删除的用户ID传入类中,导致_id是空值或默认值,自然匹配不到目标用户。- 冗余代码无效:
DeleteUserAction里的Type type = typeof(DatabaseContext);和FieldInfo fieldInfo = type.GetField("Users");完全没用到,属于无效代码。 - 重复并发任务:
RunTaskByAction里启动4个完全相同的删除任务,会导致并发冲突(比如第一个任务删完用户后,后面的任务执行Single会抛出找不到用户的异常),完全没必要。 - 上下文管理混乱:你忽略了
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
相关产品推荐
相关产品推荐

