这个让我感到烦恼:我有一个基于数据库构建的EF模型,该数据库包含一个名为Category的表,其中包含6行。
我想在WPF的下拉列表中显示它,所以我需要将它绑定到Categories.Local
Observable集合。
问题是这个可观察的集合永远不会收到数据库表的内容。我的理解是,在执行查询或使用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()
,但正如预期的那样,它不起作用,因为它首先是db,而不是代码优先。
我还浏览了这个页面https://msdn.microsoft.com/en-us/library/jj574514(v=vs.113).aspx,创建了一个基于对象的数据源并将我的组合框链接到它,但没有成功。
有谁知道我做错了什么? 提前感谢您的帮助。
答案 0 :(得分:1)
DbSet<T>
类是IQueryable<T>
,因此DbSet<T>.Count()
方法映射到Queryable.Count<T>
扩展方法,后者又转换为SQL查询并返回记录的计数数据库表没有将任何内容加载到db上下文本地缓存中。
虽然DbSet<T>.Local
只是让您访问本地缓存。它包含您添加的实体以及通过查询加载的实体,这些实体返回T
个实例(或通过导航属性引用T
的其他实体)。要完全加载(填充)本地缓存,您需要调用Load
:
_db.Categories.Load();
Load
是QueryableExtensions
类中定义的自定义扩展方法,因此您需要包含
using System.Data.Entity;
以便访问它(以及键入Include
,XyzAsync
和许多其他EF扩展方法)。 Load
方法相当于ToList
,但没有创建额外列表的开销。
一旦你这样做,绑定将起作用。请注意,Local
不会反映通过不同的DbContext
实例或不同的应用程序/用户对数据库所做的更改。