C# 实体框架实体状态已修改

本文关键字:实体 修改 框架 状态 | 更新日期: 2023-09-27 18:30:35

我对C#很陌生。我正在尝试创建一个用户配置文件数据库,并将其显示在 C# 的 WPF 列表视图中,首先使用实体框架代码。

我已经设法在数据库中添加和删除配置文件,并显示它们。我卡在修改现有对象上,经过一段时间尝试使其工作,我得到的最接近的事情是所选对象(在列表视图中选择)使它上面的对象接收更新。

这是"保存"按钮的代码

private void btnSaveChanges_Click(object sender, RoutedEventArgs e)
{
        using (UsersContext ctx = new UsersContext())
        {
            User user = ctx.Users.Find(UsersTable.SelectedIndex);
            if (user != null)
            {
                user.Name = txtUName.Text;
                user.IdNumber = txtIdNumber.Text;
                user.Department = txtDepartment.Text;
                user.Position = txtPosition.Text;
                user.Username = txtUsername.Text;
                user.Password = pwbPassword.Password;
            }
            ctx.Entry(user).State = System.Data.Entity.EntityState.Modified;
            ctx.SaveChanges();
            txtUName.Text = "";
            txtIdNumber.Text = "";
            txtDepartment.Text = "";
            txtPosition.Text = "";
            txtUsername.Text = "";
            pwbPassword.Password = "";
            UsersTable.ItemsSource = ctx.Users.ToList();
        }
    }
}

问题是当我选择并尝试更新数据库的第一个条目(列表视图中的第一行)时,我收到"ArgumentNullException 未处理"错误/异常。

Visual Studio指出错误来自:

ctx.Entry(user).State = System.Data.Entity.EntityState.Modified;

此外,我无法在最后一行保存更改,因为当我选择它时,更改将保存在它上面的行中。

我真的很感激一些帮助。

C# 实体框架实体状态已修改

异常来自

ctx.Entry(user).State = System.Data.Entity.EntityState.Modified;

因为您没有在空检查中包含该行。因此,如果用户为 null,则会导致该异常。

至于一般问题:我不会尝试使用SelectedIndex选择记录。如果您有唯一键,则使用 SelectedItem 获取所选用户,然后像这样从数据库中检索您的用户:

User user = ctx.Users.FirstOrDefault(u => u.Id == selectedUser.Id);

也无需手动更改状态。EF 将为你跟踪更改,并在必要时在你调用时自动保存它ctx.SaveChanges();

您可能会研究的另一件事是使用更类似于 MVVM 的方法,并使用视图模型绑定到列表并将用户绑定到文本框。根据您的应用程序设计,您还可以考虑只有一个 DbContext,而不是在每次保存时创建一个新的 DbContext。这样,保存时无需再次从数据库中提取用户,因为 EF 已跟踪用户。