我一直在尝试实现一种解决方案,以在断开连接的情况下正确设置实体上的状态(在这种情况下,每次调用 NetCore API 都会加载 DBContext 的新实例)。Julie Lehrmann 的 Book Programming Entity Framework 中有一个解决方案,它提出了一个我想要实现的解决方案。不幸的是,它是为 EF 6 编写的。如何为 EF Core 编写这些方法?public BreakAwayContext(){ ((IObjectContextAdapter)this).ObjectContext .ObjectMaterialized += (sender, args) => { var entity = args.Entity as IObjectWithState; if (entity != null) { entity.State = State.Unchanged; entity.OriginalValues = BuildOriginalValues(this.Entry(entity).OriginalValues); } };}private static Dictionary<string, object> BuildOriginalValues( DbPropertyValues originalValues){ var result = new Dictionary<string, object>(); foreach (var propertyName in originalValues.PropertyNames) { var value = originalValues[propertyName]; if (value is DbPropertyValues) { result[propertyName] = BuildOriginalValues((DbPropertyValues)value); } else { result[propertyName] = value; } } return result;}最后这个方法private static void ApplyChanges<TEntity>(TEntity root) where TEntity : class, IObjectWithState{ using (var context = new BreakAwayContext()) { context.Set<TEntity>().Add(root); CheckForEntitiesWithoutStateInterface(context); foreach (var entry in context.ChangeTracker .Entries<IObjectWithState>()) { IObjectWithState stateInfo = entry.Entity; entry.State = ConvertState(stateInfo.State); if (stateInfo.State == State.Unchanged) { ApplyPropertyChanges(entry.OriginalValues, stateInfo.OriginalValues); } } context.SaveChanges(); }}非常感谢您帮助我将其翻译成 EF Core 兼容代码!原始代码可以在这里找到 https://www.oreilly.com/library/view/programming-entity-framework/9781449331825/ch04.html
1 回答
蝴蝶不菲
TA贡献1810条经验 获得超4个赞
您很快将不再需要将它们迁移到 EF Core,因为EF 6.3 将以 .NET Standard 2.1 为目标。
要使用它,您需要将项目迁移到 .NET Core 3.0 或 .NET Standard 2.1 for libraries。
.NET Core 3.0 将在今年下半年发布,或者你可以像现在一样使用预览版 SDK 冒一点风险。
- 1 回答
- 0 关注
- 118 浏览
添加回答
举报
0/150
提交
取消