我对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;
另外,我无法保存最后一行的更改,因为当我选择它时,更改会保存在它上面的行上。
我真的很感激一些帮助。
答案 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已经跟踪它们。