Я заметил странное поведение, которое я не могу объяснить, вероятно, из-за динамических 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
?
Я заметил это во время тестирования в отладочном конфиге, но на самом деле, шагая по коду, похоже, что поведение происходит немного реже.
Что здесь происходит?