4

我正在使用 Entity Framework 和 Caliburn.Micro 来实现 MVVM 应用程序。

基本上,我已经将 AuthorModel 和 BookModel 设置为一对多的关系——一个作者有多本书,而一个书只有一个作者。

我有一个 SelectBookWindow ,我在其中使用 DbContext 加载ObservableCollection<Book>,从中选择要查看/编辑的书。然后,我将选定的书作为参数传递给 EditBookWindow,其中我有一个组合框枚举所有作者,但选择了当前作者。

在这里,我ObservableCollection<Author>使用不同的 DbContext 实例加载并将其设置为组合框ItemsSource和 do SelectedItem="{Binding Author}"。(Author作为 的虚拟财产Book

ComboBox 正确显示作者列表。但是,它似乎没有将 Book's Author 显示为其 SelectedItem。

这是因为我使用了不同的 DbContext 实例吗?如果是这样,我该如何解决这个问题?

4

2 回答 2

3

是的。因为 ItemsSource 中的作者正在引用不同的对象,尽管内容与绑定到 SelectedItem 的内容相同。

我对 EF 了解不多,我想您可以对这两个实体使用相同的上下文。或者覆盖 Author 类的 equals(和 gethashcode)来比较内容,如果相同则返回 true。

于 2013-09-15T02:46:11.600 回答
1

正如 Eben 提到的,被Author引用的ItemsSource将是一个不同的对象(尽管它碰巧引用了同一个实体)。

我认为您对两个窗口都使用 new 的方法DbContext是正确的,如果您有持久性/共享性,您可能会遇到问题DbContextsEditWindow加载一个新的上下文,执行你的编辑,然后处理上下文是有意义的。

一种选择是从旧Detach的实体到新的上下文:(这里有一个很好的解释Entity Framework 4 - AddObject vs Attach)。BookDbContextAttach

我可能只是喜欢使用传递的Book实体来重新加载Book从新上下文中选择的对象,例如使用DbSet<TEntity>.Find,并使用检索到的实体绑定到SelectedItem(而不是跨窗口传递的实体)。

于 2013-09-15T12:47:43.750 回答