4
votes

I am trying to map a class from SQL to a linq collection, But I fail..

I have got this class:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Linq;
using System.Data.Linq.Mapping;

namespace SportsStore.Entities
{
    [Table(Name = "Products")]
    public class Product 
    {
        [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
        public int ProductID { get; set; }

        [Column]public string Name { get; set; }
        [Column]public string Description { get; set; }
        [Column]public `int` Price { get; set; } 
        [Column]public string Category { get; set; }

    }
}

I call that class from another class:

using SportsStore.Abstract;
using SportsStore.Entities;
using System.Data.Linq;
using System.Linq;

    namespace SportsStore.Concrete
    {
        public class SqlProductsRepository : IProductRepository
        {
            private Table<Product> productsTable;

            public SqlProductsRepository(string connnectionString)
            {
                productsTable = (new DataContext(connnectionString)).GetTable<Product>();
            }

            public IQueryable<Product> Products
            {
                get { return productsTable; }
            }
        }

    }

Basically, I get this:

base {System.SystemException} = {"Specified cast is not valid."}

This implies the cast is invalid

update My database looks like that:

>

 **ProductID  int (primary key) Name  
     nvarchar(100) Description  
 nvarchar(500) Category  
 nvarchar(50) Price  int**

StackTrace:

[InvalidCastException: Specified cast is not valid.]
System.Data.SqlClient.SqlBuffer.get_Decimal() +274
System.Data.SqlClient.SqlDataReader.GetDecimal(Int32 i) +44
Read_Product(ObjectMaterializer1 ) +1088
System.Data.Linq.SqlClient.ObjectReader
2.MoveNext() +32
System.Collections.Generic.List1..ctor(IEnumerable1 collection) +406 System.Linq.Enumerable.ToList(IEnumerable1 source) +58
SportsStore.Controllers.ProductController.List() in D:\Call.of.Duty.Modern.Warfare.3-RELOADED\SportsStore\SportsStore\SportsStore\Controllers\ProductController.cs:28 lambda_method(Closure , ControllerBase , Object[] ) +96
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +51
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary
2 parameters) +409
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 parameters) +52
System.Web.Mvc.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a() +127 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func
1 continuation) +436
System.Web.Mvc.<>c_DisplayClassf.b_c() +61 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList1 filters, ActionDescriptor actionDescriptor, IDictionary2 parameters) +305
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +830
System.Web.Mvc.Controller.ExecuteCore() +136
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +111 System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +39
System.Web.Mvc.<>c_DisplayClass8.b_4() +65
System.Web.Mvc.Async.<>c_DisplayClass1.b_0() +44
System.Web.Mvc.Async.<>c__DisplayClass81.<BeginSynchronous>b__7(IAsyncResult _) +42 System.Web.Mvc.Async.WrappedAsyncResult1.End() +141 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +54
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +52 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8966925 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

2
What is the type of productsTable, and what's the detail of the exception (full stack trace etc)? - Jon Skeet
I convert the returned productsTable into a list..using toList.. later on - Dmitry Makovetskiyd
When I step into the code productsTable doesnt show any results returned..it gives me the exception in place of the results - Dmitry Makovetskiyd

2 Answers

5
votes

Your error message states that the value for the Price column cannot be converted to a decimal.

You need to make sure that your database table has the correct column type for the Price column and that it contains valid data.

Also, if your column in the database allows NULL values, you need to map it to a nullable decimal with decimal? Price { get; set; }

3
votes

You've got a column defined as [Column]public decimal Price { get; set; }. Are you sure this is actually a suitable datatype for the data in the database? - could the data in the database be Varchar, or allow nulls?