Създавам таблица на mssql база данни, „Поръчки“, която ще съдържа поле varchar(50), „Стойност“, съдържащо низ, който представлява леко сложен тип данни, „Стойност на поръчката“.
Използвам клас 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 се обърква и извежда грешка.
Мога ли да направя нещо, за да не се обърка и да извърша имплицитното преобразуване?