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
相关产品推荐
相关产品推荐

