1

我要尝试解释这一点,而不是真正地通过我正在工作的应用程序的整个设计。因为谁在乎这一点。如果相关,我可以提供更多细节,但我认为我涵盖了以下所有内容。并发问题使用DbContext.Database.Connection.CreateCommand

主要问题

我已经得到了我需要定期执行一些存储过程。我从数据库表中获取proc名称,所以我的应用程序没有硬编码知识。这是设计。我目前正在使用实体框架来完成我所有的数据访问。我的应用程序是多线程的 - 我抓住所有需要运行的过程,然后遍历每个过程,从我的配置表中获取它的属性,并将它排队以在应用程序的线程池中的单独线程上运行。

我正在使用Database.Connection.CreateCommand方法并执行procs - 将数据拉入数据表。当我只执行一个proc时,这可以很好地工作,但是当我遇到并发问题时。我得到具体的例外是

System.Data.SqlClient.SqlException: 新的事物是不允许的,因为 有在 会话中运行其他线程。

我假设这是因为我试图执行我的程序,同时也通过实体框架访问另一个过程的属性。


潜在的解决方案/发生在我思绪的列车:

  • 我能得到这个蛮好用DbContext.Database.SqlQuery方法的工作,如果我写一个模型类,有我需要的领域。但是如果我根本不想写一个模型课呢?有没有一种方法可以做到这一点,让实体框架实际处理查询?

  • 我可以抓住所有的属性,然后开始执行任何特效。这可能会正常工作。如果我将属性定义为模型中的ICollections,它告诉我要运行的过程,当从数据库中选择所述模型时,是否有强制加载它们的方法,而不是稍后再遍历它们以读取它们?

回答

4

这里的主要问题是,你正在使用一个数据库连接(Database.Connection返回所有CreateCommand调用同一个实例)通过多线程和你试图同时定义多个交易。此场景的解决方案只有一个 - 为每个存储过程/线程使用一个新连接。您应该能够通过调用Database.Connection.ConnectionString来获取连接字符串。

  • 您的第一个解决方案不会解决问题,除非您在每个线程中运行新的上下文。
  • Database.SqlQuery总是需要用于加载数据的类型。通过将结果集映射到类型,实体框架使数据访问变得更加简单。如果你没有类型,你不能享受EF的优势。
  • 立即加载关系的方式称为加载加载,由查询中使用的Include方法执行。您只需说出映射实体上的哪些导航属性必须立即加载。
+0

创建一个新的连接听起来像个好主意。有什么我需要记住的吗?任何“不要杀死您的服务器”警告? {{im新数据库的东西}} – 2011-05-02 04:55:20