我遇到了同样的问题,最后想出了一个解决方案。基本思想是防止某些导航类类型附加到 ObjectContext。这是我所做的:
- 修改了 context.tt 模板以使 SelfTrackingEntitiesContextExtensions 类部分化。
- 将 2 个 ApplyChanges 函数复制到新创建的 Custom.Context.Extension.cs 并将它们重命名为 CustomApplyChanges。每个都有一个额外的参数作为类型数组
public static void CustomApplyChanges(this ObjectContext context, string entitySetName, TEntity entity, Type[] excludeTypes ) where TEntity : IObjectWithChangeTracker
- 向 for 循环添加条件以排除 excludeTypes 数组中包含的任何类类型。
区域句柄初始实体状态
foreach (IObjectWithChangeTracker changedEntity in entityIndex.AllEntities.Where(x => x.ChangeTracker.State == ObjectState.Deleted &&
!excludeTypes.Contains(x.GetType())))
{ HandleDeletedEntity(context, entityIndex, allRelationships, changedEntity); }
foreach (IObjectWithChangeTracker changedEntity in entityIndex.AllEntities.Where(x => x.ChangeTracker.State != ObjectState.Deleted && !excludeTypes.Contains(x.GetType())))
{ HandleEntity(context, entityIndex, allRelationships, changedEntity); }
端区
- 用途
Type[] excludeTypes = { typeof(Asset), typeof(Address), typeof(Region)};
rep.Entities.CustomApplyChanges(entity, excludeTypes); var changedEntry = rep.Context.ObjectStateManager.GetObjectStateEntries>(System.Data.EntityState.Added | System.Data.EntityState.Modified | System.Data.EntityState.Deleted); foreach (var e in changedEntry) { if (excludeTypes.Any(c => c == e.Entity.GetType())) { rep.Context.Detach(e.Entity); //分离未更改的对象 } }