Linq to Sql, приведение System.Exception недопустимо - PullRequest
4 голосов
/ 09 января 2012

Я пытаюсь отобразить класс из SQL в коллекцию linq, но мне не удается ..

У меня есть этот класс:

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; }

    }
}

Я вызываю этот класс из другого класса:

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; }
            }
        }

    }

По сути, я получаю это:

base {System.SystemException} = {"Указанное приведение недействительно."}

Это означает, что приведение неверно

обновление Моя база данных выглядит так:

>

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

StackTrace:

[InvalidCastException: указанное приведение недопустимо.]
System.Data.SqlClient.SqlBuffer.get_Decimal () + 274
System.Data.SqlClient.SqlDataReader.GetDecimal (Int32 i) + 44
Read_Product (ObjectMaterializer 1 ) +1088<br> System.Data.Linq.SqlClient.ObjectReader 2.MoveNext () + 32
System.Collections.Generic.List 1..ctor(IEnumerable 1 коллекция) +406 System.Linq.Enumerable.ToList (IEnumerable 1 source) +58<br> 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<br> System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +51<br> System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary 2 параметра) + 409
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2 parameters) +52<br> System.Web.Mvc.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a() +127 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func 1 продолжениеon) + 436
System.Web.Mvc. <> c_ DisplayClassf.b _c () +61 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters (ControllerContext controllerContext, параметры IList 1 filters, ActionDescriptor actionDescriptor, IDictionary 2))+ 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__DisplayClass8 1.<BeginSynchronous>b__7(IAsyncResult _) +42 System.Web.Mvc.Async.WrappedAsyncResult 1.End () +141 System.Web.Mvc.Async.AsyncResultWrapper.End (IAsyncResult asyncResult, тег объекта) + 54
System.Web.Mvc.Async.AsyncResultWrapper.End (тег IAsyncResult asyncResult, объект)40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest (результат IAsyncResult) + 38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionSte.HttpApplication.ExecuteStep (шаг IExecutionStep, логическое и завершено синхронно) + 184

Ответы [ 2 ]

5 голосов
/ 09 января 2012

В вашем сообщении об ошибке указывается, что значение для столбца Price невозможно преобразовать в decimal.

Необходимо убедиться, что в таблице базы данных указан правильный тип столбца для столбца Price и что он содержит действительные данные.

Кроме того, если ваш столбец в базе данных допускает значения NULL, вам нужно сопоставить его с дробным десятичным числом с decimal? Price { get; set; }

3 голосов
/ 09 января 2012

У вас есть столбец, определенный как [Column]public decimal Price { get; set; }. Вы уверены, что это действительно подходящий тип данных для данных в базе данных? - могут ли данные в базе данных быть Varchar или разрешены нули?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...