Проблема с отношением многие ко многим в EF Code First - PullRequest
0 голосов
/ 03 апреля 2011

У меня есть 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 Ответ

5 голосов
/ 05 апреля 2011

Эта проблема называется несколькими активными наборами результатов (также известными как MARS). Ваш первый foreach открыл DataReader, читая Items, но в то же время ваш внутренний foreach вызывает отложенную загрузку Params. Это откроет второй одновременный DataReader. Чтобы разрешить одновременное чтение нескольких данных на одном соединении, вы должны разрешить это в строке соединения:

Data Source=.;Initial Catalog=Test;Integrated Security=SSPI;MultipleActiveResultSets=true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...