有没有一种方法可以在不同线程中异步使用一个dbContext?
var context = new Entities();
Task.Factory.StartNew(() => context.Companies.Include(x => x.Address).First());
Task.Factory.StartNew(() => context.Companies.Include(x => x.Owner).First());
//after some changes...
context.SaveChanges();
context.Dispose();
主要思想是立即保存所有内容,如果某些操作无法返回所有更改,则保存所有内容。实际上,我使用的是传递给viewmodel及其子viewmodel的工作单元对象,因此它们尝试异步获取信息...上面的代码说明了问题。上面的代码将引发异常:
EntityFramework.dll中发生类型为'System.InvalidOperationException'的异常,但未在用户代码中处理。创建模型时无法使用上下文。如果在OnModelCreating方法内部使用上下文,或者多个线程同时访问同一上下文实例,则可能引发此异常。注意,不能保证DbContext和相关类的实例成员是线程安全的。
主要问题是,如果我想使用多个DbContext实例,则每个数据传输对象将包含字段的不同信息。有什么建议么?谢谢!
上下文不是线程安全的。期。因此,永远不要从多个线程访问上下文,也不要跳过箍来尝试使其成为线程安全的。
您可以简单地将代码包装在中TransactionScope
,然后Task
以创建其自己的上下文并保存其更改的操作开始每个代码:
using (var tran = new TransactionScope())
{
Task.Factory.StartNew(() => DoSomething());
Task.Factory.StartNew(() => DoSomethingElse());
// Wait all
tran.Complete();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句