【问题标题】:Entity not providing up to date info in a WPF datagrid C#实体未在 WPF 数据网格 C# 中提供最新信息
【发布时间】:2013-09-27 10:21:18
【问题描述】:

我在 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 工作正常。

【问题讨论】:

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


    【解决方案1】:

    这可能取决于您定义变量的位置: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?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-06
      • 2018-11-21
      • 2013-11-02
      • 1970-01-01
      • 2021-05-20
      • 2014-04-19
      • 2011-12-13
      • 2021-01-23
      相关资源
      最近更新 更多