在实体框架中多次调用我的对象实体是不对的?

时间:2014-08-25 09:56:01

标签: c# multithreading entity-framework service

我在不同的线程中每隔十秒运行一次Windows服务。

此服务将SQL Server 2008数据库上的各种CRUD操作放在同一台计算机上。

对于每个CRUD操作,我都放了一个“使用”括号,如下例所示:

public object InsertClient(clsClient c)
{
    using (ClientEntities e = new ClientEntities()) {
        e.Clients.AddObject(c);
    }
}

如果已经有另一个线程与同一个表进行交互,那么我担心这个操作的效率。这是正确的方法吗?

此外,使用此方法是否存在线程异常的风险?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

不,只要您立即创建和处理多个对象实体,就没有错。

以下是MSDN的一般建议。

  
      
  • 使用长时间运行的对象上下文时,请考虑以下事项:

         
        
    • 当您将更多对象及其引用加载到内存中时,对象上下文可能会在内存消耗中快速增长。这可能会导致   表现问题。

    •   
    • 请记住在不再需要时处理上下文。

    •   
    • 如果异常导致对象上下文处于不可恢复状态,整个应用程序可能会终止。
    •   
    • 随着查询和更新数据的时间之间的差距越来越大,遇到与并发相关的问题的可能性也会增加。
    •   
  •   
  • 使用Web应用程序时,请为每个请求使用对象上下文实例。如果要跟踪对象之间的更改   层,使用自我跟踪实体。有关更多信息,请参阅   使用自我跟踪实体和构建N层应用程序。
  •   
  • 使用Windows Presentation Foundation(WPF)或Windows窗体时,请为每个窗体使用一个对象上下文实例。这可以让你使用   更改对象上下文提供的跟踪功能。
  •   

如果您担心每个新对象实体创建连接的成本,由于EF依赖于数据提供程序,并且提供程序是ADO.Net,默认情况下启用connection pooling,除非您在连接字符串。

此外,元数据是每个应用程序域全局缓存,因此每个新对象实体都只是从全局缓存中复制元数据。

由于EF不是线程安全的,因此建议在每个线程中使用每个对象实体。

  

与.NET一样,实体框架不是线程安全的。这意味着   您可以在多线程环境中使用实体框架   需要将各个ObjectContexts明确地保持在一起   线程,或者非常认真地锁定线程以便你   不要碰撞。 - MSDN