EF Code First中的多对多关系问题

时间:2011-04-03 12:06:39

标签: entity-framework ado.net

我有以下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

1 个答案:

答案 0 :(得分:5)

这是一个称为多个活动结果集(也称为MARS)的问题。您的第一个foreach已打开DataReader阅读Items,但同时您的内部foreach会触发延迟加载Params。这将打开第二个并发DataReader。要在单个连接上允许多个并发数据读取器,必须在连接字符串中允许它:

Data Source=.;Initial Catalog=Test;Integrated Security=SSPI;MultipleActiveResultSets=true