实体框架将对象从一个上下文传递到另一个上下文

本文关键字:上下文 一个 另一个 框架 对象 实体 | 更新日期: 2023-09-27 17:56:29

我是实体框架的新手,所以请耐心等待。

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

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???
    }
}

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

任何帮助,不胜感激。

谢谢!

实体框架将对象从一个上下文传递到另一个上下文

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

完全可以取消这些实体的排队,将它们"附加"到不同的上下文,更新它们,然后调用SaveChanges来保留更改。

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

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

相关文章: