我需要使用MultipleActiveResultSets功能吗

本文关键字:MultipleActiveResultSets 功能 | 更新日期: 2023-09-27 18:27:20

我的Linq to Entities查询是这样的:

ForEach(something)
{
   var query = (some DB query).ToList();
   for each(var x in query)
   {
       var query2 = some other DB query;
   }
} 

我的连接字符串中需要MultipleActiveResultSet吗?或者我把它拿出来就不疼了?

我需要使用MultipleActiveResultSets功能吗

对于您给出的示例,禁用MARS应该很好,因为您正在急切地加载(使用ToList())。如果你没有,那么你需要让它保持启用状态。

然而,如果你忘记了急切地加载,你就会遇到问题。对于query中的第一个元素,您可以在第二个foreach打开连接并执行读取,但保持连接打开。然后,您尝试执行第二个查询(您的第二个活动结果集),但它会失败,抛出System.Data.Entity.Core.EntityCommandExecutionException,抱怨:

已经有一个打开的DataReader与此命令关联,必须先关闭它。

你可以在几分钟内(我刚刚做了)通过设置控制台应用程序并试用它来测试这一点。这是我的应用程序:

class Program
{
    static void Main(string[] args)
    {
        using (var db = new Config())
        {
            // foreach (var demo in db.Demos) uncomment this, and comment the below line, to make it throw
            foreach (var demo in db.Demos.ToList()) // doing this makes it work, since the first query is done and the connection closed
            {
                Console.WriteLine(demo.Name);
                var s = db.Demo2s.FirstOrDefault(d => d.id == demo.demo2ID);
                Console.WriteLine(s.Name + " " + s.id);
            }
            foreach (var demo2 in db.Demo2s)
            {
                Console.WriteLine(demo2.id + " " + demo2.Name);
            }
        }
        Console.ReadKey();
    }
}
public class Config : DbContext
{
    public Config()
        : base("test")
    { }
    public DbSet<demo> Demos { get; set; }
    public DbSet<demo2> Demo2s { get; set; }
}
internal sealed class Configuration : DbMigrationsConfiguration<ConsoleApplication1.Config>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }
    protected override void Seed(ConsoleApplication1.Config context)
    {
        List<demo2> d2 = new List<demo2>
        {
            new demo2 {Name = "One"},
            new demo2 {Name = "Two"},
            new demo2 {Name = "Three"}
        };
        foreach (var demo in d2)
        {
            context.Demo2s.Add(demo);
        }
        context.SaveChanges();
        List<demo> e = new List<demo>
        {
            new demo {Name = "First", demo2ID = 1},
            new demo {Name = "Second", demo2ID = 2},
            new demo {Name = "Third" , demo2ID = 3}
        };
        foreach (var demo in e)
        {
            context.Demos.Add(demo);
        }
        context.SaveChanges();
    }
}

连接字符串,去掉MARS设置:

<connectionStrings>
    <add name="test" connectionString="Data Source=.;Initial Catalog=EFTesting;Integrated Security=SSPI;application name=EntityFramework" providerName="System.Data.SqlClient"/>
  </connectionStrings>
相关文章:
  • 没有找到相关文章