尝试从某些任务向DbContext
添加新实体时,我收到以下异常,代码在向此事添加任务之前有效。
$ exception {"在模型出现时不能使用上下文 已创建。"} System.Exception {System.InvalidOperationException}
我做了一些研究,发现this,它包含了一些有用的信息:
此错误的另一个原因可能是您在创建上下文时 第一次因此导致您创建模型 单独线程上的另一个上下文。你将不得不等待其他 模型创建后要创建的上下文实例 完成。
所以我想问题是等待上下文的正确方法是什么?
这是我的代码,以防我猜错我的问题:
using(SampleEntities context = new SampleEntities())
{
context.Configuration.LazyLoadingEnabled = false; //I tried this in case it was the problem
Task[] TaskArray = new Task[4];
for (int i = 0; i < TaskArray.Length; i++)
TaskArray[i] = Task.Run(() =>
{
SampleEntity Result = null;
while(this._Data.TryDequeue(out Result)) //where Data is a ConcurrentQueue<SampleEntity> with the entities to insert
{
if(!context.SampleEntity.Any(/*Comparisons between properties to check if the entities values are already inserted*/)
context.Add(Result);
}
}
Task.WaitAll(TaskArray);
context.SaveChanges();
}
行if(!context.SampleEntity.Any(...
修改
我有大量的寄存器先前已加入_Data
,我试图尽可能加快质量插入。
答案 0 :(得分:1)
一个上下文和许多线程 - 这是一个不好的做法。最好为每个线程创建上下文。我建议你重新考虑你的算法并为每个线程重新设置上下文。