You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF 6.2(.NET Framework)如何设置MergeOption为PreserveChanges?

解决EF6.2中设置MergeOption.PreserveChanges的问题

嗨,我正好对EF6的这个细节比较熟悉,咱们一步步来解决你的问题:

首先,你的核心疑问:MergeOption.PreserveChanges不是只适用于.NET Core!

EF6(基于.NET Framework)完全支持这个枚举值,你找不到ObjectQuery是因为命名空间变了——在EF6里,ObjectQuery和MergeOption都移到了System.Data.Entity.Core.Objects命名空间下,而不是旧EF版本(EF4/5)的System.Data.Objects。所以第一步要确保你引用了正确的命名空间:

using System.Data.Entity.Core.Objects;

为什么直接强转会报错?

EF6中的DbQuery<T>并没有直接继承ObjectQuery<T>,而是通过IObjectQueryAdapter这个内部接口来暴露底层的ObjectQuery实例。所以你之前直接把DbQuery强转成ObjectQuery的方式会抛出类型转换异常,这是正常的。

正确的设置方式

你可以通过IObjectQueryAdapter接口来获取底层的ObjectQuery,然后设置MergeOption:

// 假设query是你的DbQuery<TB_CLASSES>实例
var objectQuery = ((IObjectQueryAdapter)query).ObjectQuery;
objectQuery.MergeOption = MergeOption.PreserveChanges;

另外,如果你是从DbContext的DbSet发起查询,也可以直接通过ObjectContext来构建查询并设置MergeOption:

// 先获取ObjectContext
var objectContext = ((IObjectContextAdapter)yourDbContext).ObjectContext;
// 创建ObjectSet并设置MergeOption
var objectSet = objectContext.CreateObjectSet<TB_CLASSES>();
objectSet.MergeOption = MergeOption.PreserveChanges;
// 执行查询
var results = objectSet.Where(c => c.Id == 123).ToList();

补充说明

MergeOption.PreserveChanges的作用是:当查询返回的实体和上下文中原有的实体存在冲突时,会保留上下文里已经修改过的值,不会被查询结果覆盖。这个行为在EF6的.NET Framework环境下完全生效,放心用就好。

内容的提问来源于stack exchange,提问作者Steve Homayooni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:37:35