0

我在 WPF 窗口上有一个数据网格,它显示了我的用户列表。这段代码可以正常工作。

private void UpdateGrid()
{
    var query = db.Users;
    GridUsers.ItemsSource = query.ToArray();
}

有一个编辑按钮,可在前一个窗口的顶部打开一个新窗口,让您编辑其中一个用户。当我完成编辑后,会有一个调用 db.savechanges 的保存。这一切都很好,如果我在那里放一个断点,我的 SQL 数据库中就会发生变化。然后关闭此窗口并在用户屏幕上再次调用 UpdateGrid 方法。数据网格不会更新以显示 SQL 表中的新值。我还有另一个添加和删除用户的按钮,当在执行这些任务之一后调用 UpdateGrid 方法时,数据网格是最新的。

为什么这不能正确更新我的数据网格?

更新:我已经解决了这个问题。我仍然不确定为什么会这样。我的用户屏幕有一个从 null 开始的全局用户变量。以下代码在按下编辑按钮时设置它。

WorkingUser = (User) GridUsers.SelectedItem;

然后编辑屏幕使用以下代码获取正确的实体。

User editUser = (from s in db.Users where (s.UserName == ManageUsers.WorkingUser.UserName) select s).FirstOrDefault();

当调用 db.users.remove(editUser) 然后调用 db.savechanges 时,数据网格更新工作正常。但是,当我编辑 editUser 并调用 db.savechanges 时,dataGrid 无法正确显示。我意识到我不必进行选择,只需使用以下代码即可。

User editUser = ManageUsers.WorkingUser

现在当我编辑editUser updateGrid 工作正常。

4

1 回答 1

0

这可能取决于您定义变量的位置:db. 如果它是一个实体框架 ObjectContext 并且它是定义 UpdateGrid 方法的类中的一个实例变量,那么无论其他人是否更新了持久性存储中的数据,您总是会在第一次执行查询时实现客户端实体。

发生这种情况是因为身份解析默认使用 AppendOnly 的 MergeOptions 发生。有关进一步说明,请参见此处:http: //msdn.microsoft.com/en-us/library/vstudio/bb896269%28v=vs.100%29.aspx段落:身份解析和合并选项。

如果您使用新的 ObjectContext 打开一个新窗口来更改数据库数据,您将不会在您的第一个 ObjectContext 中获得这些更改的证据。如果您碰巧在新窗口或其他地方添加了客户,那么您将获得新添加的证据。就现有客户端实例而言,它们的属性不会在网格中更新。

您可以在每次调用 UpdateGrid 时创建上下文的新实例,也可以按照此处的说明更改上下文配置:

如何强制 EF Code First 查询数据库?

于 2013-09-27T10:48:29.513 回答