[英]Creating a ThreadLocal EF context
我在使用Entity Framework调用时遇到了一些奇怪的错误,并且我正在探索它们是否可能是由于使用同一ObjectContext
进行并发多线程访问所致。
我试图通过将创建上下文放在ThreadLocal内为每个线程创建一个新上下文。
private System.Threading.ThreadLocal<EF.XYZEntities> threadLocalContext = new System.Threading.ThreadLocal<EF.XYZEntities>(() => new EF.XYZEntities(connectionString));
private EF.XYZEntities context { get { return threadLocalContext.Value; } }
这是行不通的。 该上下文的首次使用会引发错误:
无效的对象名称“ dbo.Site”。
我该如何工作?
除非您很好地管理所有事情,否则通常认为使用共享上下文是“坏的”。 使用管理不善的共享上下文会产生非常奇怪的结果。
通常,最佳实践是在上下文中采用“工作单元”方法:
using (DBEntities ctx = new DBEntities())
{
// Explicitly open the context connection yourself - to help prevent connection pooling / sharing
// The connection will automatically be closed once exiting the using statement,
// but it won't hurt to put a ctx.Connection.Close(); after everything inside the using statement.
ctx.Connection.Open();
// Do Stuff
// If necessary ctx.SaveChanges();
// Not necessary but you could put a ctx.Connection.Close() here, for readability if nothing else.
}
更新:回应下面Noseratio关于异步和EF的评论。 从这里取
非目标
以下是我们明确不尝试使用EF6中的功能启用的功能:
线程安全
尽管线程安全性将使异步更加有用,但这是一个正交功能。 鉴于EF与由用户代码组成的图进行交互以维护状态,并且没有简单的方法来确保该代码也是线程安全的,因此我们尚无法在最一般的情况下实现对它的支持。
目前,EF将检测开发人员是否试图一次执行两个异步操作并抛出...。
EF中的异步支持需要.NET 4.5,而在.NET 4上将不可用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.