У меня есть пользовательский тип данных с именем StudentID
, который имеет неявное преобразование в строку.
Когда я передаю экземпляр StudentID
в SqlCommand.Parameters.AddWithValue
(в качестве значения) и выполняю команду, я получаю следующую ошибку:
No mapping exists from object type StudentID to a known managed provider native type.
Указание типа для параметра, например SqlDbType.NVarChar
, не помогает. Единственное, что работает, - это явное приведение значения StudentID
к строке, что лишает смысла иметь неявное приведение.
Я предполагаю, что фреймворк не учитывает доступные преобразования. Могу ли я что-нибудь сделать с классом StudentID
, чтобы команда обрабатывала его, не требуя явного приведения к примитивному типу?
В этой статье MSDN говорится о том, как обрабатываются примитивные типы, но не определяемые пользователем типы. Наиболее близким совпадением будет объект, который, как он говорит, передается как вариант.
Точная точка отказа находится в методе System.Data.SqlClient.MetaType.GetMetaTypeFromValue с подписью private static MetaType GetMetaTypeFromValue(Type dataType, object value, bool inferLen)
. Отражение показывает, что он ищет примитивные типы, и если TypeCode является объектом, он ищет типы данных Sql *, такие как SqlBoolean, поэтому он, похоже, ищет очень специфические типы примитивных или Sql * типов.