14

我是实体框架的新手,所以请多多包涵。

我有一个程序,我想从表中选择多条记录并将其存储在队列中:

private Queue<RecordsToProcess> getRecordsToProcess()
{
    Queue<RecordsToProcess> results = new Queue<RecordsToProcess>();
    using (MyEntity context = new MyEntity())
    {
        var query = from v in context.RecordsToProcess
                            where v.Processed == false
                            select v;

        foreach (RecordsToProcess record in query)
        {
            results.Enqueue(record);
        }
    }
}

然后我启动多个工作线程。每个工作线程获取队列中的一项,对其进行处理,然后将其保存到数据库中。

private void processWorkerThread(object stateInfo)
{
    while (workQueue.Count > 0)
    {
        RecordToProcess record = new RecordToProcess;
        lock(workQueue)
        {
            if (workQueue.Count > 0)
                RecordToProcess = workQueue.Dequeue();
            else
                break;
        }

        //Do the record processing here

        //How do I save that record here???
    }
}

我的理解是,要将更改保存回数据库,您只需调用 context.SaveChanges() 但在这种情况下我不能这样做,可以吗?

任何帮助表示赞赏。

谢谢!

4

2 回答 2

12

由于您MyEntity在第一种方法中处理上下文(通过将其包装在using语句中),因此入队的实体将处于“分离”状态。这意味着,除其他外,不会跟踪对实体所做的更改,并且您将无法延迟加载导航属性。

将这些实体出列,将它们“附加”到不同的上下文,更新它们,然后调用SaveChanges以保持更改是非常好的。

您可以阅读有关附加和分离对象以及添加/附加和实体状态的信息

于 2013-01-28T22:47:20.663 回答
2

如果您将主键保存在队列中并再次检索实体可能会更安全。这样,您更有可能避免任何数据并发问题。

于 2013-01-28T22:47:00.347 回答