Voi*_*miX 0 ado.net entity-framework
我有以下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)
Run Code Online (Sandbox Code Playgroud)
和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; }
}
Run Code Online (Sandbox Code Playgroud)
要设置映射,我使用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");
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试枚举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);
}
Run Code Online (Sandbox Code Playgroud)
我使用Ef Code First RC
这是一个称为多个活动结果集(也称为MARS)的问题.你的第一个foreach已打开DataReader阅读,Items但同时你的内部foreach触发延迟加载Params.这将打开第二个并发DataReader.要在单个连接上允许多个并发数据读取器,必须在连接字符串中允许它:
Data Source=.;Initial Catalog=Test;Integrated Security=SSPI;MultipleActiveResultSets=true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
392 次 |
| 最近记录: |