Это одна из тех уродливых проблем фиксации отношений, которые время от времени вызывают проблемы с EOC 4 POCO.
Если вы посмотрите на классы, созданные генератором POCO, вы увидите область с именем " Исправление ассоциации ", содержащую некоторые методы, такие как FixupSecurityGroup
или аналогичные, которые вызываются из установщиков свойств ваших POCO. Я мог бы воспроизвести вашу проблему, но даже после отладки я не смог найти точную точку, где она работает неправильно в этих методах исправления. Поэтому я не могу объяснить, почему ваш код не работает.
Но я нашел два решения, которые работают:
1) Не создавайте группу с new
, а используйте метод CreateObject
:
SecurityUser user = context.SecurityUsers
.SingleOrDefault(cond => cond.User_ID == 1);
SecurityGroup group = context.SecurityGroups.CreateObject();
user.SecurityGroup = group;
context.SaveChanges();
(Я удалил AddObject
. В этом нет необходимости, поскольку EF распознает, что группа новая, и создает инструкцию INSERT, но удаление только AddObject
не решает проблему.)
Ваши свойства POCO virtual
, и EF создаст динамический прокси для SecurityUser
при загрузке его из БД. Очевидно, по какой-то причине динамический прокси-сервер также для создаваемого вами SecurityGroup
необходим, в противном случае мы получим ваше исключение нулевой ссылки. CreateObject
создаст этот прокси.
2) Вы также можете отключить создание прокси:
context.ContextOptions.ProxyCreationEnabled = false;
SecurityUser user = context.SecurityUsers
.SingleOrDefault(cond => cond.User_ID == 1);
SecurityGroup group = new SecurityGroup();
user.SecurityGroup = group;
context.SaveChanges();
Теперь user
не является динамическим прокси, и код также работает при создании группы с помощью обычного оператора new
.