Я нашел решение этой проблемы здесь: Код Первое добавление в коллекции?Как использовать Code First с репозиториями?
Я удалил 'virtual' из всех свойств, кроме коллекций и отложенных загруженных объектов, то есть всех собственных типов.
Но я до сих пор не понимаю, как вы можете оказаться в ситуации, когда у вас есть нулевая коллекция, которую вы не можете использовать, и у вас нет возможности установить ее в действительную коллекцию.
Iтакже нашел этот ответ от Роуэн Миллер на форуме MSDN
Привет,
Если вы сделаете все свои свойства виртуальными, тогда EF создаст прокси-классы во время выполнения, которыепроисходит от вашего POCO, эти прокси позволяют EF узнавать об изменениях в режиме реального времени, а не собирать исходные значения вашего объекта, а затем сканировать изменения при сохранении (это, очевидно, имеет преимущества в производительности и использовании памяти, но разницабудет незначительным, если в память не загружено большое количество объектов).Они известны как «прокси отслеживания изменений», если вы сделаете свои свойства навигации виртуальными, тогда прокси-сервер все еще генерируется, но он намного проще и просто включает некоторую логику для выполнения отложенной загрузки при доступе к свойству навигации.
Поскольку ваш исходный код генерировал прокси-серверы отслеживания изменений, EF заменял свойство вашей коллекции специальным типом коллекции, чтобы помочь ему узнать об изменениях.Поскольку вы пытаетесь вернуть коллекцию обратно в простой список в конструкторе, вы получаете исключение.
Если только вы не видите проблем с производительностью, я последую совету Терренса и просто уберу "виртуальный" из ваших свойств, не связанных с навигацией..
~ Rowan
Похоже, у меня проблема с полным «прокси отслеживания изменений», только если все мои свойства виртуальные.Но, учитывая это, почему я до сих пор не могу использовать виртуальное свойство на прокси-сервере отслеживания изменений?Этот код взрывается в третьей строке, потому что ds2.DanceEvents имеет значение null и не может быть установлен в конструкторе:
DanceStyle ds2 = ctx.DanceStyles.Where(ds => ds.DanceStyleId == 1).Single();
DanceEvent evt = CreateDanceEvent();
ds2.DanceEvents.Add(evt);
Я все еще в замешательстве, хотя мой код теперь работает из-за вышеуказанного исправления.