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

时间:2016-01-16 11:59:26

标签: c# wpf entity-framework

我对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();
        }
    }
}

问题是当我选择并尝试更新数据库的第一个条目(listview中的第一行)时,我得到“ArgumentNullException未处理”错误/异常。

Visual Studio表示错误来自:

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

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

我真的很感激一些帮助。

1 个答案:

答案 0 :(得分:0)

例外来自

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

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

至于一般问题:我不会尝试使用SelectedIndex选择记录。如果您有一个唯一键,那么使用SelectedItem获取所选用户并从DB中检索您的用户,如下所示:

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

此外,无需手动更改状态。 EF会跟踪您的更改,并在您致电ctx.SaveChanges();

时自动保存

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