繁体   English   中英

创建ThreadLocal EF上下文

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM