Когда вы смотрите код класса ObjectParameter
конструкторы
public ObjectParameter (string name, object value)
public ObjectParameter (string name, Type type)
Вы видите, что ObjectParameter
имеет 3 важных приватных поля:
_name
(имя параметра, не нулевое и неизменное), _type
(тип параметра CLR, ненулевое и неизменное), _value
(значение параметра, может быть изменено и обнулено)
Когда используется первый конструкторвсе эти поля инициализированы.Со вторым конструктором поле _value
остается равным null
.
В ExecuteFunction
EF используется закрытый метод CreateEntityCommandForFunctionImport
, который вызывает другой, еще более глубокий закрытый метод PopulateFunctionImportEntityCommandParameters
который присоединяет параметры сущности.
Внутри PopulateFunctionImportEntityCommandParameters
, экземпляр EntityParameter
, представляющий параметр в EntityCommand
, будет сопоставлен со свойствами имени и значения ObjectParameter
.
Эта инструкция объясняет все это:
entityParameter.Value = objectParameter.Value ?? DBNull.Value;
Мы передаем DBNull
в EF, если в качестве параметра не было указано значение.