2014-02-05 24 views
4

我刚刚尝试了实体框架5和kendo ui的某些功能。我有以下ProductType枚举查询实体在枚举字段上抛出“无效操作异常”

public enum ProductType { 
    [Description("Hazardous")] 
    Hazardous, 
    [Description("Non Hazardous")] 
    NonHazardous 
} 

此枚举类型是在产品实体领域之一。

[Table("Products")] 
public class Product { 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    //Other Fields ... 

    [Required(ErrorMessage="Product Type is Required")] 
    public ProductType ProductType {get;set;} 

} 

在底层SQL Server数据库的ProductType列定义为(TINYINT非空)。在MVC

public ActionResult _ProductList(int pageSize, int skip) { 
     using (WorkUnit workUnit = new WorkUnit()) { 
      IQueryable<Product> products = workUnit.ProductRepository.GetAllProducts() 
                .Include(p => p.Category); 
      int total = products.Count(); 
      List<Product> productList = products.ToList<Product>(); //Throws InvalidOperationException 
      return Json(new { total = total, data = productList }, JsonRequestBehavior.AllowGet); 
     } 
    } 

以下控制器操作产品

我访问列表下面是对products.ToList()扔在上面的控制器动作InvalidOperationException异常的描述。

The 'ProductType' property on 'Product' could not be set to a 'Byte' value. 
You must set this property to a non-null value of type 'ProductType'. 

任何猜测为什么ToList()被抛出InvalidOperationException异常

仅供参考,以前存在数据库,实体是基于数据库手动编码为POCO的。

编辑

下面是完整的异常细节

System.InvalidOperationException was unhandled by user code 
    HResult=-2146233079 
    Message=The 'ProductType' property on 'Product' could not be set to a 'Byte' value. You must set this property to a non-null value of type 'ProductType'. 
    Source=System.Data.Entity 
    StackTrace: 
     at System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal) 
     at System.Data.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32 ordinal, String propertyName, String typeName) 
     at lambda_method(Closure , Shaper) 
     at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet) 
     at lambda_method(Closure , Shaper) 
     at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) 
     at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext() 
     at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
     at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
     at KendoUI_Web_Demo.Controllers.HomeController._ProductList(Int32 pageSize, Int32 skip) in d:\Practice\ASP.NET_MVC\KendoUI_Web_Demo\KendoUI_Web_Demo\Controllers\HomeController.cs:line 52 
     at lambda_method(Closure , ControllerBase , Object[]) 
     at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
     at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() 
     at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) 
     at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() 
    InnerException: 

回答

15

还有就是枚举类型而你的情况是基于int和数据库之间的不匹配,其中基于列是字节(TINYINT) 。你可以通过设置你的枚举类型的正确基础类型来解决这个问题:

public enum ProductType : byte 
{ 
... 
} 
+0

我在想这个字节是默认的。但正如您所指出的,并且在此处进行了记录(http://msdn.microsoft.com/zh-cn/library/sbbt4032(v=vs.110).aspx)的确如此。 – Jatin