EF5迁移至EF6:含EntityState与ID条件的查询转换方案咨询
解决EF5到EF6迁移中实体状态与ID结合的查询问题
我明白你在迁移过程中遇到的痛点——EF6不再推荐直接通过EntityObject获取实体状态,而你需要同时兼顾ID判断和分组集合的状态校验。下面分两种核心场景给出解决方案:
1. 针对分组后的IGrouping集合(你的item变量)
原来的写法依赖强制转换EntityObject,在EF6里可以通过ChangeTracker关联实体与状态,同时保留ID过滤逻辑。为了性能考虑,建议先把所有Added状态的实体缓存到HashSet中,避免重复遍历ChangeTracker:
// 先预加载所有处于Added状态的EntityX实体 var addedEntityXSet = new HashSet<EntityX>( context.ChangeTracker.Entries<EntityX>() .Where(entry => entry.State == EntityState.Added) .Select(entry => entry.Entity) ); // 针对你的分组集合item进行统计 var targetCount = item.Count(x => x.ID < 0 && addedEntityXSet.Contains(x));
如果追求极简写法(性能稍差,适合小数据集),也可以直接在Count里关联ChangeTracker:
var targetCount = item.Count(x => x.ID < 0 && context.ChangeTracker.Entries<EntityX>().Any(entry => entry.Entity == x && entry.State == EntityState.Added) );
2. 全局场景(直接统计符合条件的实体,无需分组)
如果你只是需要全局统计ID<0且处于Added状态的EntityX,直接在ChangeTracker.Entries里同时加两个过滤条件即可,补上你之前缺失的ID判断:
var globalCount = context.ChangeTracker.Entries<EntityX>() .Count(entry => entry.Entity.ID < 0 && entry.State == EntityState.Added);
兼容旧模型的特殊情况(不推荐)
如果你的实体仍然继承自EntityObject(比如基于旧EDMX的Database First模型),EF6其实仍支持通过IEntityWithChangeTracker接口获取状态,但强烈建议逐步迁移到POCO实体:
var targetCount = item.Count(x => x.ID < 0 && ((IEntityWithChangeTracker)x).EntityState == EntityState.Added );
迁移小贴士
EF6的设计更偏向POCO实体,脱离对EntityObject的依赖后,代码会更简洁且易于维护。如果你的项目还在使用旧的实体模型,可以考虑逐步重构为POCO,配合Code First或DbContext的现代化用法。
内容的提问来源于stack exchange,提问作者Federico Navarrete
相关产品推荐
相关产品推荐

