我有以下3个表格:
CREATE TABLE [dbo].[Items](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL)
CREATE TABLE [dbo].[Params](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[DisplayName] [nvarchar](50) NOT NULL)
CREATE TABLE [dbo].[Params2Items](
[ParamID] [int] NOT NULL,
[ItemID] [int] NOT NULL,
[ID] [int] IDENTITY(1,1) NOT NULL)
和2个相应的类
public class Item
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<ItemParameter> Params { get; set; }
}
public class ItemParameter
{
public int ID { get; set; }
public string DisplayName { get; set; }
public virtual ICollection<Item> Items { get; set; }
}
要设置映射,我使用EntityTypeConfiguration类
public class ItemConfiguration : EntityTypeConfiguration<Item>
{
public ItemConfiguration()
{
HasKey(i => i.ID);
Property(i => i.Name).IsRequired();
HasMany(x => x.Params).WithMany(k => k.Items)
.Map(m => m.ToTable("Params2Items").MapLeftKey("ParamID").MapRightKey("ItemID"))
;
ToTable("Items");
}
}
当我尝试枚举Params集合时,我得到“已经有一个与此命令关联的开放DataReader,必须先关闭它。”例外
static void Main(string[] args)
{
using (KMCatalog context = new KMCatalog())
{
foreach (var s in context.Items)
{
Console.WriteLine(s.Name);
foreach (var itemParameter in s.Params) //exception here
{
Console.WriteLine(itemParameter.DisplayName);
}
}
}
Console.ReadKey(true);
}
我使用Ef Code First RC
答案 0 :(得分:5)
这是一个称为多个活动结果集(也称为MARS)的问题。您的第一个foreach
已打开DataReader
阅读Items
,但同时您的内部foreach
会触发延迟加载Params
。这将打开第二个并发DataReader
。要在单个连接上允许多个并发数据读取器,必须在连接字符串中允许它:
Data Source=.;Initial Catalog=Test;Integrated Security=SSPI;MultipleActiveResultSets=true