实体框架独立实体不相等

时间:2014-04-02 22:54:03

标签: c# .net entity-framework entity-framework-6

我正在使用Entity Framework 6,我正在尝试使用没有更改跟踪的实体。所以我申请

MergeOption = MergeOption.NoTracking
在获取实体之前

到ObjectQuery。

在我的应用程序中,我有一个状态下拉列表,状态是实体。 Status下拉列表的ItemSource将设置为对象查询返回的EntityCollection。

我有一个包含状态的订单实体。如果我不更改MergeOption并使用默认值,我可以将SelectedValue设置为绑定到Order的状态,它可以正常工作。但是,如果我使用NoTracking,则不会在下拉列表中选择适当的状态。

有没有办法将分离的实体用作ItemSource并且仍然可以正确绑定SelectedValue?

2 个答案:

答案 0 :(得分:2)

如评论所述,您通过参考进行比较; statusmyOrder.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}" 
/>