Я создаю таблицу базы данных mssql "Orders", которая будет содержать поле varchar (50), "Value", содержащее строку, представляющую слегка сложный тип данных, "OrderValue".
Я использую класс linqtosql datacontext, который автоматически вводит столбец «Значение» в виде строки.
Я дал операторы неявного преобразования класса OrderValue в строку и из строки, поэтому я могу легко использовать неявное преобразование с классами linqtosql, например:
// get an order from the orders table
MyDataContext db = new MyDataContext();
Order order = db.Orders(o => o.id == 1);
// use implicit converstion to turn the string representation of the order
// value into the complex data type.
OrderValue value = order.Value;
// adjust one of the fields in the complex data type
value.Shipping += 10;
// use implicit conversion to store the string representation of the complex
// data type back in the linqtosql order object
order.Value = value;
// save changes
db.SubmitChanges();
Однако мне бы очень хотелось, чтобы класс linqtosql мог указать это поле как «OrderValue», а не как «string». Тогда я смогу избежать сложного кода и переписать вышеизложенное как:
// get an order from the orders table
MyDataContext db = new MyDataContext();
Order order = db.Orders(o => o.id == 1);
// The Value field is already typed as the "OrderValue" type rather than as string.
// When a string value was read from the database table, it was implicity converted
// to "OrderValue" type.
order.Value.Shipping += 10;
// save changes
db.SubmitChanges();
Чтобы достичь этой желаемой цели, я посмотрел на конструктор текстовых данных и выбрал поле «Значение» таблицы «Заказ».
Затем в свойствах я изменил «Тип» на «global :: MyApplication.OrderValue».
Свойство «Тип данных сервера» оставлено как «VarChar (50) NOT NULL»
Проект собран без ошибок.
Однако при чтении из таблицы базы данных мне было выдано следующее сообщение об ошибке:
Could not convert from type 'System.String' to type 'MyApplication.OrderValue'.
at System.Data.Linq.DBConvert.ChangeType(Object value, Type type)
at Read_Order(ObjectMaterializer`1 )
at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at Example.OrdersProvider.GetOrders()
at ... etc
По трассировке стека, я считаю, что эта ошибка происходит при чтении данных из таблицы. При представлении преобразования строки в мой пользовательский тип данных, даже если присутствуют неявные операторы преобразования, класс DBConvert запутывается и выдает ошибку.
Могу ли я что-нибудь сделать, чтобы не запутаться и неявно преобразовать?