实体框架代码优先和生产者/消费者模式

时间:2012-07-21 05:13:25

标签: entity-framework entity-framework-4 ef-code-first

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

生产者

  • 根据搜索条件从DB实现对象
  • 应用其他特定于应用程序的过滤逻辑
  • 对物化对象进行排队以进行进一步处理

消费者(多线程)

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

问题

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

即您希望在没有事先选择更新路径的情况下关注此更新:

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

关于此方法的重要注意事项是,您只能将实体(由唯一键定义)附加到跟踪图表一次。因此,在隔离的环境中执行此操作或仔细管理附加调用非常重要。