.net 使用DbContext.Database.Connection.CreateCommand时出现并发问题

.net 使用DbContext.Database.Connection.CreateCommand时出现并发问题,.net,entity-framework,sql-server-2008,concurrency,entity-framework-4.1,.net,Entity Framework,Sql Server 2008,Concurrency,Entity Framework 4.1,我将试图解释这一点,但实际上不涉及我正在开发的应用程序的整个设计。因为谁在乎这个。如果相关的话,我可以提供更多的细节,但我想我涵盖了下面的所有内容 主要问题: 我有一些需要定期执行的存储过程。我从数据库表中获取进程名,因此我的应用程序没有硬编码的知识。这是故意的。我目前正在使用实体框架来访问所有数据 我的应用程序是多线程的——我获取需要运行的所有进程,然后迭代每个进程,从配置表中获取其属性,并将其排队,以便在应用程序线程池中的单独线程上运行 我正在使用Database.Connection.Cr

我将试图解释这一点,但实际上不涉及我正在开发的应用程序的整个设计。因为谁在乎这个。如果相关的话,我可以提供更多的细节,但我想我涵盖了下面的所有内容

主要问题:

我有一些需要定期执行的存储过程。我从数据库表中获取进程名,因此我的应用程序没有硬编码的知识。这是故意的。我目前正在使用实体框架来访问所有数据

我的应用程序是多线程的——我获取需要运行的所有进程,然后迭代每个进程,从配置表中获取其属性,并将其排队,以便在应用程序线程池中的单独线程上运行

我正在使用Database.Connection.CreateCommand方法并执行过程—将数据拉入数据表。当我只执行一个进程时,这很好,但是当

问题是我遇到了并发性问题。我得到的具体例外是

System.Data.SqlClient.SqlException: 不允许新事务处理,因为 中还有其他线程在运行 会议

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

我想到的潜在解决方案/思路:

如果我编写了一个包含所需字段的模型类,那么使用DbContext.Database.SqlQuery方法可以很好地实现这一点。但是如果我根本不想写一个模型类呢?有没有一种方法可以让实体框架实际处理查询

我可以在开始执行任何程序之前获取所有属性。那可能行得通。如果我将属性定义为模型上的ICollections,它告诉我要运行什么过程,那么当我从DB中选择所述模型时,是否有方法强制加载这些属性,而不是在稍后迭代读取它们时


这里的主要问题是您使用的是单个数据库连接数据库。连接为多个线程的所有CreateCommand调用返回相同的实例,并且您试图同时定义多个事务。此场景的解决方案只有一个—每个存储过程/线程使用一个新连接。您应该能够通过调用Database.connection.ConnectionString来获取连接字符串

除非在每个线程中运行新的上下文,否则第一个解决方案将无法解决问题。 Database.SqlQuery始终需要类型才能加载数据。实体框架通过将结果集映射到类型来简化数据访问。如果你没有类型,你就不能利用EF。 立即加载关系的方法称为“急切加载”,由查询中使用的Include方法执行。您只需说明必须立即加载映射实体上的哪些导航属性。
这里的主要问题是您使用的是单个数据库连接数据库。连接为多个线程的所有CreateCommand调用返回相同的实例,并且您试图同时定义多个事务。此场景的解决方案只有一个—每个存储过程/线程使用一个新连接。您应该能够通过调用Database.connection.ConnectionString来获取连接字符串

除非在每个线程中运行新的上下文,否则第一个解决方案将无法解决问题。 Database.SqlQuery始终需要类型才能加载数据。实体框架通过将结果集映射到类型来简化数据访问。如果你没有类型,你就不能利用EF。 立即加载关系的方法称为“急切加载”,由查询中使用的Include方法执行。您只需说明必须立即加载映射实体上的哪些导航属性。