我需要使用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吗?或者我把它拿出来就不疼了?
对于您给出的示例,禁用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>