实体未在WPF数据网格C#中提供最新信息

时间:2013-09-27 10:21:19

标签: c# sql visual-studio-2012 entity wpfdatagrid

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

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

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

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

更新: 我已经解决了这个问题。我仍然不确定为什么会发生这种情况。我的用户屏幕有一个全局用户变量,从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时,datagrid更新工作正常。但是,当我编辑editUser并调用db.savechanges时,dataGrid无法正确显示。我意识到我没有必要进行选择而只是使用了跟随代码。

User editUser = ManageUsers.WorkingUser

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

1 个答案:

答案 0 :(得分:0)

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

这是因为默认情况下,标识解析与AppendOnly的MergeOptions一起发生。 请参阅此处以获取进一步说明:http://msdn.microsoft.com/en-us/library/vstudio/bb896269%28v=vs.100%29.aspx在段落中:身份解析和合并选项。

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

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

How to force EF Code First to query the database?