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

本文关键字:最新 信息 实体 数据 WPF 数据网 网格 未在 | 更新日期: 2023-09-27 18:33:05

>我在 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时,数据网格更新工作正常。但是,当我编辑编辑用户并调用db.savechanges时,数据网格无法正确显示。我意识到我不必进行选择,只需使用以下代码即可。

User editUser = ManageUsers.WorkingUser

现在,当我编辑编辑用户更新网格工作正常时。

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

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

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

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

您可以在每次调用 UpdateGrid 时创建上下文的新实例,也可以更改上下文配置,如下所述:

如何强制 EF 代码优先查询数据库?