我正在使用Entity Framework和Caliburn.Micro来实现MVVM应用程序。
基本上,我已经将AuthorModel和BookModel设置为一对多的关系 - 一个拥有多本书籍和一本书只有一个作者的作者。
我有一个SelectBookWindow,我使用DbContext加载ObservableCollection<Book>
,从中我选择了一个我要查看/编辑的书。然后我将选定的Book作为参数传递给EditBookWindow,我在其中列出了所有作者的组合框,但选择了当前的作者。
在这里,我使用不同的DbContext实例加载ObservableCollection<Author>
并将其设置为组合框的ItemsSource
以及SelectedItem="{Binding Author}"
。 (Author
是Book
)的虚拟属性
ComboBox正确显示作者列表。但是,它似乎没有将Book的作者显示为其SelectedItem。
这是因为我使用的是不同的DbContext实例吗?如果是这样,我该如何纠正这个问题?
答案 0 :(得分:3)
是的。因为ItemsSource中的作者引用了不同的对象,尽管内容与绑定到SelectedItem的内容相同。
我对EF知之甚少,我猜你可以为这两个实体使用相同的上下文。或者覆盖Author类的equals(和gethashcode)来比较内容,如果相同则返回true。
答案 1 :(得分:1)
正如Eben所提到的,Author
引用的ItemsSource
将是一个不同的对象(尽管它恰好引用了同一个实体)。
我认为您在两个窗口中使用新DbContext
的方法是正确的,如果您持久/共享DbContexts
,则可能会遇到问题。使用新上下文加载EditWindow
,执行编辑以及处理上下文是有意义的。
一个选项是Detach
来自旧Book
的{{1}}实体,DbContext
实体到您的新背景:(这里有一个很好的解释Entity Framework 4 - AddObject vs Attach )。
我可能只是赞成使用传递的Attach
实体从新的上下文重新加载选定的Book
,例如使用DbSet<TEntity>.Find
,并使用检索到的实体绑定到Book
(而不是您通过窗口的那个)。