2

我正在实现生产者/消费者模式:

制片人

  • 根据搜索条件从数据库中具体化对象
  • 应用其他特定于应用程序的过滤逻辑
  • 将物化对象排队以进行进一步处理

消费者(多线程)

  • 从队列接收物化对象
  • 使用来自物化对象的数据填充电子邮件模板
  • 更新物化对象状态
  • 将新对象状态保存到数据库

问题

这些对象是使用 Entity Framework Code First 使用与生产者线程关联的上下文来实现的。

消费者线程需要自己的上下文。

是否可以将物化对象(每个对象实际上是一个对象图)从生产者上下文移动到消费者上下文,或者我必须在消费者的上下文中重新实现对象以便在那里更新它?我该怎么做?

4

1 回答 1

2

我认为您想要的是以下内容:

  • 从队列接收物化对象
  • 使用来自物化对象的数据填充电子邮件模板
  • 将物化根附加到一个新的上下文(保持这个上下文的范围很小)
  • 更新物化对象状态
  • 将新对象状态保存到数据库

实体框架允许您将对象重新附加到上下文跟踪图,并将其视为数据库中对象的当前状态。这意味着它只会更新您在更新块中触及的属性。

即您想在没有事先选择更新路径的情况下遵循此更新:

using (var context = new MyContext())
{
    var dummy = new Test{Id= 1};
    context.Tests.Attach(dummy);
    dummy.Something = "Hello World";
    context.SaveChanges();
}

关于此方法需要注意的重要一点是,您只能将实体(由唯一键定义)附加到跟踪图一次。因此,在孤立的上下文中执行此操作或仔细管理附加调用非常重要。

于 2012-07-21T05:31:39.107 回答