将这些方法从 EF 6 转换为 EF Core

我一直在尝试实现一种解决方案,以在断开连接的情况下正确设置实体上的状态(在这种情况下,每次调用 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


慕侠2389804
浏览 119回答 1
1回答

蝴蝶不菲

您很快将不再需要将它们迁移到 EF Core,因为EF 6.3 将以 .NET Standard 2.1 为目标。要使用它,您需要将项目迁移到 .NET Core 3.0 或 .NET Standard 2.1 for libraries。.NET Core 3.0 将在今年下半年发布,或者你可以像现在一样使用预览版 SDK 冒一点风险。
打开App,查看更多内容
随时随地看视频慕课网APP