Helping linqtosql datacontext use implicit conversion between varchar column in the database and tab

Posted by user213256 on Stack Overflow See other posts from Stack Overflow or by user213256
Published on 2010-05-01T08:58:21Z Indexed on 2010/05/01 9:07 UTC
Read the original article Hit count: 245

Filed under:
|
|

I am creating an mssql database table, "Orders", that will contain a varchar(50) field, "Value" containing a string that represents a slightly complex data type, "OrderValue".

I am using a linqtosql datacontext class, which automatically types the "Value" column as a string.

I gave the "OrderValue" class implicit conversion operators to and from a string, so I can easily use implicit conversion with the linqtosql classes like this:

// 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();

However, I would really like to be able to tell the linqtosql class to type this field as "OrderValue" rather than as "string". Then I would be able to avoid complex code and re-write the above as:

// 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();

In order to achieve this desired goal, I looked at the datacontext designer and selected the "Value" field of the "Order" table.

Then, in properties, I changed "Type" to "global::MyApplication.OrderValue".

The "Server Data Type" property was left as "VarChar(50) NOT NULL"

The project built without errors.

However, when reading from the database table, I was presented with the following error message:

Could not convert from type 'System.String' to type 'MyApplication.OrderValue'.

at System.Data.Linq.DBConvert.ChangeType(Object value, Type type) at Read_Order(ObjectMaterializer1 ) at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader2.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) at Example.OrdersProvider.GetOrders() at ... etc

From the stack trace, I believe this error is happening while reading the data from the table. When presented with converting a string to my custom data type, even though the implicit conversion operators are present, the DBConvert class gets confused and throws an error.

Is there anything I can do to help it not get confused and do the implicit conversion?

Thanks in advance, and apologies if I have posted in the wrong forum.

cheers / Ben

© Stack Overflow or respective owner

Related posts about datacontext

Related posts about .NET