实体框架分离的实体不相等

本文关键字:实体 不相等 分离 框架 | 更新日期: 2023-09-27 17:56:12

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

MergeOption = MergeOption.NoTracking

在获取我的实体之前到对象查询。

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

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

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

实体框架分离的实体不相等

正如评论所述,您正在通过参考进行比较; statusmyOrder.Status是两个不同的对象。 如果两次不同的时间(但来自同一上下文实例)从上下文中加载相同的实体,则将获得相同的对象,这就是它们等效的原因。

您可以按主键或实体的每个属性的值进行比较,具体取决于您希望等效性对此实体意味着什么。

if( status.Id == myOrder.Status.Id )
if( status.FieldA == myOrder.Status.FieldA &&
    status.FieldB == myOrder.Status.FieldB )

在我上面的评论中发布的这篇博文中,作者描述了如何通过在模型中包含外键列来做到这一点。有些人可能不希望外键列包含在他们的模型中,所以这不适合他们(包括我自己),但我想发布一个答案,因为这将解决我上面描述的问题。

在 XAML 中,您只需使用以下行的内容,以便 ComboBox 使用 Order 模型的 Status_Id 属性与 StatusCollection 中状态的 Id 属性进行比较:

<ComboBox ItemsSource="{Binding StatusCollection}" 
  DisplayMemberPath="Name" 
  SelectedValuePath="Id" 
  SelectedValue="{Binding MyOrder.Status_Id,Mode=TwoWay}" 
/>