我正在使用Entity Framework 6,我正在尝试使用没有更改跟踪的实体。所以我申请
MergeOption = MergeOption.NoTracking
在获取实体之前到ObjectQuery。
在我的应用程序中,我有一个状态下拉列表,状态是实体。 Status下拉列表的ItemSource将设置为对象查询返回的EntityCollection。
我有一个包含状态的订单实体。如果我不更改MergeOption并使用默认值,我可以将SelectedValue设置为绑定到Order的状态,它可以正常工作。但是,如果我使用NoTracking,则不会在下拉列表中选择适当的状态。
有没有办法将分离的实体用作ItemSource并且仍然可以正确绑定SelectedValue?
答案 0 :(得分:2)
如评论所述,您通过参考进行比较; status
和myOrder.Status
是两个不同的对象。如果从上下文中加载相同的实体两次(但来自同一个上下文实例),您将获得相同的对象,这就是它们等效的原因。
您可以按主键或实体的每个属性的值进行比较,具体取决于您希望等效于此实体的含义。
if( status.Id == myOrder.Status.Id )
if( status.FieldA == myOrder.Status.FieldA &&
status.FieldB == myOrder.Status.FieldB )
答案 1 :(得分:0)
我在上面的评论中发布的this blog post中,作者通过在模型中包含外键列来描述如何执行此操作。有些人可能不希望他们的模型中包含外键列,所以这不适合他们(包括我自己),但我想发布一个答案,因为这将解决我上面描述的问题。
在XAML中,您只需使用这些行中的某些内容,以便ComboBox使用Order模型的Status_Id属性与StatusCollection中状态的Id属性进行比较:
<ComboBox ItemsSource="{Binding StatusCollection}"
DisplayMemberPath="Name"
SelectedValuePath="Id"
SelectedValue="{Binding MyOrder.Status_Id,Mode=TwoWay}"
/>