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

Posted

技术标签:

【中文标题】实体框架分离的实体不相等【英文标题】:Entity Framework Detached Entities Not Equal 【发布时间】:2014-04-02 22:54:03 【问题描述】:

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

MergeOption = MergeOption.NoTracking

在获取我的实体之前到 ObjectQuery。

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

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

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

【问题讨论】:

您是通过引用进行比较,而不是按值进行比较。 我改写了问题的最后一部分,问什么是真正重要的。手动比较值/引用对我来说并不重要。 【参考方案1】:

正如评论所述,您是通过引用进行比较; statusmyOrder.Status 是两个不同的对象。如果你从上下文加载同一个实体两次不同的时间(但从同一个上下文实例),你会得到同一个对象,这就是为什么它们是等价的。

您可以按主键或实体的每个属性的值进行比较,具体取决于您希望该实体的等效含义。

if( status.Id == myOrder.Status.Id )

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

【讨论】:

这是比较实体的好消息。您对如何让 ComboBox ItemSource 绑定与不同上下文中的实体一起工作有任何见解吗? 您能否提供更多代码来说明如何绑定数据源以及当前用于比较值的代码? 我发现这个blog 帮助很大。我试图使用分离的实体来规避一次编辑多个实体但只保存一个特定实体的问题。我为整个应用程序使用单个对象上下文。我意识到该方法不适合我的情况,因此我开始将其更改为“每个窗口单个上下文”方法,到目前为止效果很好。【参考方案2】:

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

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

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

【讨论】:

以上是关于实体框架分离的实体不相等的主要内容,如果未能解决你的问题,请参考以下文章

实体框架分离实体和相关实体消失

在 Entity Framework 6 中保存分离的实体

实体框架:使用分离的对象和附加的对象

如何在不删除 Sonata AdminBundle 中的实体的情况下分离关系?

分离实体和被管理实体

实体框架代码优先 - DbContext 上没有 Detach() 方法