如何在使用者类型的应用程序中缓存DataContext实例?

问题描述 投票:3回答:1

我们有一个使用我们提供商提供的SDK的应用程序,可以轻松地与他们集成。该SDK连接到AMQP端点,并简单地将消息分发,缓存和转换给我们的使用者。以前,这种集成是通过HTTP进行的,使用XML作为数据源,并且旧的集成具有两种缓存DataContext的方式-每个Web请求和每个托管线程ID。 (1)

但是,我们现在不通过HTTP进行集成,而是通过AMQP集成,这对我们来说是透明的,因为SDK可以完成所有连接逻辑,而且我们只剩下定义我们的使用者,因此没有选择可以按Web请求缓存DataContext ”,因此仅保留每个托管线程ID。我实现了责任链模式,因此当有更新时,将其放在处理程序的一个管道中,该处理程序使用DataContext根据新的更新来更新数据库。这就是管道的调用方法的样子:

public Task Invoke(TInput entity)
{
    object currentInputArgument = entity;

    for (var i = 0; i < _pipeline.Count; ++i)
    {
        var action = _pipeline[i];
        if (action.Method.ReturnType.IsSubclassOf(typeof(Task)))
        {
            if (action.Method.ReturnType.IsConstructedGenericType)
            {
                dynamic tmp = action.DynamicInvoke(currentInputArgument);
                currentInputArgument = tmp.GetAwaiter().GetResult();
            }
            else
            {
                (action.DynamicInvoke(currentInputArgument) as Task).GetAwaiter().GetResult();
            }
        }
        else
        {
            currentInputArgument = action.DynamicInvoke(currentInputArgument);
        }
    }

    return Task.CompletedTask;
}

问题是(至少我认为是这样),责任链是返回/启动新任务的方法链,所以当实体A的更新到来时,它由托管线程id = 1处理那么只有在同一实体A再次到达后,才由托管线程id = 2处理,例如。这导致:

System.InvalidOperationException:'IEntityChangeTracker的多个实例不能引用一个实体对象。'>

因为托管线程ID = 1中的DataContext已经跟踪了实体A。(至少我认为是这样)

我的问题是如何在我的情况下缓存DataContext?你们有同样的问题吗?我阅读了thisthis答案,从我的理解,使用一个静态DataContext也不是一种选择。(2)

  1. 免责声明:我应该说我们继承了该应用程序,但我无法回答为什么要这样实现。
  2. 免责声明2:我对EF经验很少甚至没有经验。

  3. 社区问的问题:

  1. 我们正在使用哪个版本的EF? 5.0

我们有一个使用我们提供商提供的SDK的应用程序,可以轻松地与他们集成。该SDK连接到AMQP端点,并简单地将消息分发,缓存和转换给我们的使用者。 ...

c# entity-framework datacontext
1个回答
0
投票

我不知道您正在处理的实际情况。但据我所知每个工作单元只能播放一个DbContext

© www.soinside.com 2019 - 2024. All rights reserved.