1

这让我发疯:我有一个基于数据库的 EF 模型,该数据库包含一个名为 Category 的表,其中包含 6 行。我想在 WPF 的下拉列表中显示它,所以我需要将它绑定到Categories.LocalObservable 集合。问题是这个可观察的集合永远不会收到数据库表的内容。我的理解是,在执行查询或保存数据时,集合应该与数据库同步,SaveChanges() 所以我运行了以下 2 个测试:

  Categories = _db.Categories.Local;

  // test 1
  Debug.WriteLine(_db.Categories.Count());
  Debug.WriteLine(_db.Categories.Local.Count());

  // test 2
  _categories.Add(new Category() { CategoryName = "test" });
  _db.SaveChanges();
  Debug.WriteLine(_db.Categories.Count());
  Debug.WriteLine(_db.Categories.Local.Count());
  Debug.WriteLine(_categories.Count());

测试 1 在数据库中显示 6 行,在本地显示 0 行。测试 2 在数据库中显示 7 行,在本地显示 1 行(两个版本)

我也尝试使用_db.Category.Load(),但正如预期的那样,它不起作用,因为它是数据库优先,而不是代码优先。

我还浏览了这个页面https://msdn.microsoft.com/en-us/library/jj574514(v=vs.113).aspx,创建了一个基于对象的数据源并将我的组合框链接到它,但没有成功.

有谁知道我做错了什么?预先感谢您的帮助。

4

1 回答 1

2

该类DbSet<T>IQueryable<T>,因此DbSet<T>.Count()方法映射到Queryable.Count<T>扩展方法,扩展方法又被转换为 SQL 查询并返回数据库表中的记录数,而不将任何内容加载到数据库上下文本地缓存中。

虽然DbSet<T>.Local只是让您访问本地缓存。它包含您添加的实体以及由返回实例的查询加载的实体(或通过导航属性T引用的其他实体)。T为了完全加载(填充)本地缓存,您需要调用Load

 _db.Categories.Load();

是类中定义的Load自定义扩展方法QueryableExtensions,所以需要包含

using System.Data.Entity;

为了访问它(以及 typedIncludeXyzAsync许多其他 EF 扩展方法)。该Load方法等效于ToList但没有创建额外列表的开销。

一旦你这样做了,绑定就会起作用。请注意,这Local不会反映通过不同DbContext实例或不同应用程序/用户对数据库所做的更改。

于 2017-07-18T07:31:31.737 回答