Почему мои отношения EF4.1 не устанавливаются в нуль при присваивании нулевого значения? - PullRequest
6 голосов
/ 23 апреля 2011

В моей системе есть задачи, которые по желанию можно назначить контактам.Так что в моей бизнес-логике у меня есть следующий код:

 if (_contactChanged) { task.Contact = contact; }

Если контакт не был указан, переменная contact равна нулю.Это предполагается , чтобы обнулить контактные отношения, когда я отправляю изменения, однако я заметил, что это не происходит в 99% случаев, когда я это делаю (я видел, как это происходило один раз, но не последовательно после переходачерез этот код снова и снова).

Когда я отлаживаю, я убедился, что _contactChanged - это true, и внутренний код не получает удар.Однако после того, как я прошел мимо task.Contact = contact;, я заметил, что хотя contact равно нулю, task.Contact имеет тип

{System.Data.Entity.DynamicProxies
.Contact_4DF70AA1AA8A6A94E9377F65D7B1DD3A837851FD3442862716FA7E966FFCBAB9}

и все еще имеет предыдущие данные, связанные с ним.

Почему прокси не имеет нулевого значения, и как я могу заставить это работать правильно?

1 Ответ

9 голосов
/ 24 апреля 2011

Ничего себе. Отличный вопрос Я смог подтвердить / воспроизвести это, , даже если референт не является динамическим прокси . t.Contact = null; не работает!

Лучший ответ, который у меня есть, это сказать:

    context.Entry(task).Reference(t => t.Contact).CurrentValue = null;

Я действительно надеюсь, что есть лучший способ, чем этот, потому что это довольно неудобный синтаксис.

UPDATE:

Это работает:

    var task = context.Tasks
        .Where(...your condition here...)
        .Include(t => t.Contact)
        .First();

    task.Contact = null;

ИЛИ

Если в вашей модели определен идентификатор внешнего ключа (как в обнуляемом ContactId), это становится намного проще.

...