Dynami c Прокси, вызывающие сбой объекта object.child = null? - PullRequest
0 голосов
/ 28 апреля 2020

Я заметил странное поведение, которое я не могу объяснить, вероятно, из-за динамических c прокси, потому что я не могу воссоздать его с помощью простого создания экземпляра объекта, но более странным является поведение оператора ?, которое я пробовал использовать, чтобы обойти это.

У меня есть два простых объекта:

public class Parent
{
    public int Id { get; set; }
    public virtual Child Child { get; set; }
    public string Name { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Я нахожу объект Parent, используя метод DbContext, например,

Parent parentToUpdate = _context.Parent.Find(1);

Этот объект оснащен уже заполненным потомком, скажем, с идентификатором 22, сгенерированным как System.Data.Entity.DynamicProxy

У меня есть новый дочерний объект, который становится нулевым, поскольку он не был найден в базе данных, используя тот же DbContext:

Child newChild = _context.Child.Find(999); // returns null

Затем я пытаюсь перезаписать дочерний объект parentToUpdate объектом newChild:

parentToUpdate.Child = newChild;

Это периодически не работает - parentToUpdate.Child не становится нулевым.

Вопрос 1 - Почему это не работает? Я уверен, что это как-то связано с динамическими c прокси.

Я тогда подумал, хорошо, я сначала проверю на ноль:

if(newChild == null)
{
    parentToUpdate.Child = null;
}
else
{
    parentToUpdate.Child = newChild;
}

и это if else f ormat всегда работает.

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

parentToUpdate.Child = newChild == null ? null : newChild;

И это также часто не работает.

Вопрос 2 Как этот оператор может потерпеть неудачу? Он не присваивает ни null, ни newChild объекту (который также является нулевым!) - это утверждение не является просто оператором if else?

Я заметил это во время тестирования в отладочном конфиге, но на самом деле, шагая по коду, похоже, что поведение происходит немного реже.

Что здесь происходит?

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