Проблемы с отношениями, использующими pocos в структуре объекта - PullRequest
1 голос
/ 30 ноября 2011

У меня есть приложение, в котором я использую классы POCO, и я получаю сообщение об ошибке при попытке установить связь между новым объектом и постоянным объектом.

У меня есть эти классы: SecurityUser и SecurityGroup. SecurityUser имеет свойство Group_ID, где я могу установить идентификатор для группы пользователей, и свойство SecurityGroup, где я могу установить сам объект. Когда я пытаюсь установить новое SecurityGroup для этого свойства, я получаю исключение "пустая ссылка" для класса POCO. Вот пример моего кода:

using (SecurityEntities context = new SexurityEntities(connectionString))
{
    SecurityUser user = context.SecurityUsers.SingleOrDefault(cond => cond.User_ID == 1);
    SecurityGroup group = new SecurityGroup();
    user.SecurityGroup = group;

    context.SecurityGroups.AddObject(group);
    context.SaveChanges();
}

Когда я делаю это без использования структуры сущностей без классов POCO, все идет хорошо, но с POCO это не так.

1 Ответ

1 голос
/ 01 декабря 2011

Это одна из тех уродливых проблем фиксации отношений, которые время от времени вызывают проблемы с 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...