在 Entity Framework 中,DbSet.Local 仍然不同步
in Entity Framework, DbSet.Local remains out of sync
这让我很抓狂:我有一个基于数据库构建的 EF 模型,其中包含一个 table 命名的类别,其中有 6 行。
我想在 WPF 的下拉列表中显示它,所以我需要将它绑定到 Categories.Local
Observable 集合。
问题是这个可观察的集合永远不会收到数据库的内容table。我的理解是,在使用 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,创建了一个基于对象的数据源并将我的组合框链接到它,但没有成功。
有谁知道我做错了什么?
预先感谢您的帮助。
DbSet<T>
class 是 IQueryable<T>
,因此 DbSet<T>.Count()
方法映射到 Queryable.Count<T>
扩展方法,后者又被转换为 SQL 查询和 returns 数据库中记录的计数 table 没有 将任何内容加载到数据库上下文本地缓存中。
而 DbSet<T>.Local
只是让您可以访问本地缓存。它包含您添加的实体以及通过 returns T
实例(或通过导航 属性 引用 T
的其他实体)查询加载的实体。为了完全加载(填充)本地缓存,您需要调用 Load
:
_db.Categories.Load();
Load
是在QueryableExtensions
class中定义的自定义扩展方法,所以需要包含
using System.Data.Entity;
以便访问它(以及键入 Include
、XyzAsync
和许多其他 EF 扩展方法)。 Load
方法等同于 ToList
但没有创建额外列表的开销。
完成后,绑定就会生效。请注意,Local
不会反映通过不同的 DbContext
实例或不同的 applications/users.
对数据库所做的更改
这让我很抓狂:我有一个基于数据库构建的 EF 模型,其中包含一个 table 命名的类别,其中有 6 行。
我想在 WPF 的下拉列表中显示它,所以我需要将它绑定到 Categories.Local
Observable 集合。
问题是这个可观察的集合永远不会收到数据库的内容table。我的理解是,在使用 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,创建了一个基于对象的数据源并将我的组合框链接到它,但没有成功。
有谁知道我做错了什么? 预先感谢您的帮助。
DbSet<T>
class 是 IQueryable<T>
,因此 DbSet<T>.Count()
方法映射到 Queryable.Count<T>
扩展方法,后者又被转换为 SQL 查询和 returns 数据库中记录的计数 table 没有 将任何内容加载到数据库上下文本地缓存中。
而 DbSet<T>.Local
只是让您可以访问本地缓存。它包含您添加的实体以及通过 returns T
实例(或通过导航 属性 引用 T
的其他实体)查询加载的实体。为了完全加载(填充)本地缓存,您需要调用 Load
:
_db.Categories.Load();
Load
是在QueryableExtensions
class中定义的自定义扩展方法,所以需要包含
using System.Data.Entity;
以便访问它(以及键入 Include
、XyzAsync
和许多其他 EF 扩展方法)。 Load
方法等同于 ToList
但没有创建额外列表的开销。
完成后,绑定就会生效。请注意,Local
不会反映通过不同的 DbContext
实例或不同的 applications/users.