我是Entity Framework的新手,所以请耐心等待。
我有一个程序,我想从表中选择多个记录并将其存储在队列中:
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(),但在这种情况下我不能这样做吗?
感谢任何帮助。
谢谢!
答案 0 :(得分:10)
由于您在第一个方法中处理MyEntity
上下文(通过将其包装在using
语句中),因此排队的实体将处于“分离”状态。这意味着,除其他外,将不会跟踪对实体所做的更改,并且您将无法延迟加载导航属性。
将这些实体出列,将它们“附加”到不同的上下文,更新它们,然后调用SaveChanges
来保持更改,这是完全正常的。
您可以阅读Attaching and Detaching Objects和Add/Attach and Entity States
答案 1 :(得分:2)
如果您在队列中保存主键并再次检索实体,则可能更安全。这样您就更有可能避免任何数据并发问题。