MySql 5 & LINQ to Entities EF 4, вызывающий "Объект должен реализовывать IConvertible" при запросах по сети

При использовании одного и того же кода MVC 3 & C# вместе с копиями одной и той же базы данных MySql 5.5 на 2 разных установках MySql. Один работает отлично, в то время как другой выходит из строя с ошибкой "Объект должен реализовывать IConvertible". Когда я запускаю запрос к установке MySql на моем локальном компьютере, запрос всегда работает идеально, но когда я пытаюсь сделать запрос с Visual Studio 2010 на локальном ПК на копию той же базы данных при установке MySql моего интернет-провайдера, я получаю сообщение об ошибке "Объект должен реализовать IConvertible ". Единственное, что я изменяю в коде, это имя сервера ConnectionString в файле web.config, в противном случае код и база данных в точности совпадают. ПРИМЕЧАНИЕ. Все остальные запросы к установке MySql интернет-провайдера работают отлично, только этот конкретный запрос не работает.

После нескольких попыток решить эту проблему, я убежден, что сообщение об ошибке "Объект должен реализовывать IConvertible" не имеет ничего общего с тем, что происходит на самом деле, и у меня также сложилось впечатление, что конфигурация MySql у моего провайдера может как-то вызывать эта проблема по следующим причинам:

  1. Если бы это была действительно проблема "Объект должен реализовывать IConvertible" в коде, тогда проблема сохранялась бы в коде и происходила бы независимо от того, какую установку БД я затрагивал.

  2. Я полностью удалил и воссоздал базу данных у интернет-провайдера с рабочей копии моего локального ПК, но все равно получаю точно такую ​​же ошибку.

  3. Наиболее интересным является то, что запрос имеет 3 вложенных списка IEnumerable, которые все настроены так же, как и IEnumerables, и если я закомментирую любой из этих вложенных списков в запросе, то запрос успешно выполняется для базы данных ISP. Неважно, какой вложенный список закомментирован, только то, что есть 2 или менее вложенных списка, а затем работает запрос к БД у провайдера. Это то, что приводит меня к выводу, что конфигурация MySql у интернет-провайдера может каким-то образом ограничивать мои запросы, так как у меня нет этой проблемы при запросе установки MySql на моем локальном ПК. Сообщение об ошибке действительно не относится к тому, что на самом деле происходит. Опять же, все остальные запросы к установке MySql провайдера работают отлично, однако ни один из них не содержит более 2 вложенных списков IEnumerable, где этот конкретный запрос содержит 3?

Ошибка запроса "Объект должен реализовывать IConvertible"

    Server Error in '/' Application.
    ________________________________________
    Object must implement IConvertible. 
    Description: An unhandled exception occurred during the execution of the current web request.             Please review the stack trace for more information about the error and where it originated in the code. 

    Exception Details: System.InvalidCastException: Object must implement IConvertible.

    Source Error: 

    Line 392:
    Line 393:
    Line 394:            var query =
    Line 395:                  (from p in db.products
    Line 396:                   where p.ClientId == clientId

    Source File: C:\Users\JR\Documents\Visual Studio 2010\Projects\Subversion\ReservarMVC\ReservarMVC\Models\ProductRepository.cs    Line: 394 

    Stack Trace: 

    [InvalidCastException: Object must implement IConvertible.]
    System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) +9528453
    MySql.Data.Entity.EFMySqlDataReader.ChangeType(Object sourceValue, Type targetType) +566
    MySql.Data.Entity.EFMySqlDataReader.GetValue(Int32 ordinal) +231
    System.Data.Common.Internal.Materialization.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal) +215
    System.Data.Common.Internal.Materialization.Shaper.GetColumnValueWithErrorHandling(Int32 ordinal) +46
    lambda_method(Closure , Shaper ) +180
    System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) +170
    System.Data.Common.Internal.Materialization.RowNestedResultEnumerator.MoveNext() +235
    System.Data.Common.Internal.Materialization.ObjectQueryNestedEnumerator.TryReadToNextElement() +49
    System.Data.Common.Internal.Materialization.ObjectQueryNestedEnumerator.ReadElement() +29
    System.Data.Common.Internal.Materialization.ObjectQueryNestedEnumerator.MoveNext() +68
    System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +327
    System.Linq.Enumerable.ToList(IEnumerable`1 source) +58
    ReservarMVC.Models.ProductRepository.GetProductList(Nullable`1 dateStart, Nullable`1    dateEnd,         Nullable`1 personQuantityId, Nullable`1 roomQuantityId) in C:\Users\JR\Documents     \Visual      Studio 2010\Projects\Subversion\ReservarMVC\ReservarMVC\Models\ProductRepository.cs:394
    ReservarMVC.Models.ProductRepository.GetProductListSearch(Nullable`1 dateStart, Nullable`1 dateEnd, Nullable`1 personQuantityId, Nullable`1 roomQuantityId) in C:\Users\JR\Documents\Visual Studio 2010\Projects\Subversion\ReservarMVC\ReservarMVC\Models\ProductRepository.cs:605
    ReservarMVC.Controllers.PortalController.MyExcurcion(ProductListSearchVM viewModel) in C:\Users\JR\Documents\Visual Studio 2010\Projects\Subversion\ReservarMVC\ReservarMVC\Controllers\PortalController.cs:63
     lambda_method(Closure , ControllerBase , Object[] ) +162
     System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
     System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +208
      System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
      System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +55
      System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +263
      System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19
      System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +191
      System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343
      System.Web.Mvc.Controller.ExecuteCore() +116
      System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
      System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
      System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37
      System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
      System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
      System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
      System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50
      System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
      System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
      System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
      System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
      System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8967601
      System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

      ________________________________________
      Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.261

LINQ-to-Entities Query:

    public IEnumerable<ProductListVM> GetProductList(DateTime? dateStart, DateTime? dateEnd, int? personQuantityId, int? roomQuantityId)
    {
        var query =
              (from p in db.products
               where p.ClientId == clientId
               where p.ProductTypeId == 5 
               where personQuantityId <= p.Capacity
               where roomQuantityId <= p.Quantity
               select new ProductListVM
               {
                   ProductId = p.ProductId,
                   ClientId = p.ClientId,
                   Name = p.Name_en,
                   Title = p.Title_en,
                   Description = p.Description_en,
                   Quantity = p.Quantity,
                   Capacity = p.Capacity,
                   newbookings = from b in db.bookings 
                                 where b.ProductId == p.ProductId
                                 from res in db.reservations
                                 where b.ReseravationId == res.ReservationId
                                 where b.BookingDateTime >= dateStart && b.BookingDateTime <= dateEnd && res.ReservationStateId != 3 
                                 select new BookingVM
                                 {
                                     ProductId = b.ProductId,
                                     BookingId = b.BookingId,
                                     ClientId = b.ClientId,
                                     ReservationId = b.ReseravationId,
                                     BookingDateTime = b.BookingDateTime
                                 },                  
                   newratecategories = from prc in db.productratecategories
                                       where prc.ProductId == p.ProductId
                                       from rc in db.ratecategories
                                       where prc.RateCategoryId == rc.RateCategoryId
                                       where (dateStart >= rc.DateStart && dateEnd <= rc.DateEnd) || (dateStart >= rc.DateStart || dateEnd <= rc.DateEnd)                                           
                                       select new MegaRateCategoryVM
                                       {
                                           RateCategoryId = rc.RateCategoryId,                                               
                                           DateStart = rc.DateStart,
                                           DateEnd = rc.DateEnd                                      
                                       },
                   newproductimages = (from pi in db.productimages
                                       where pi.ProductId == p.ProductId
                                       from ig in db.imagegalleries
                                       where pi.ImageGalleryId == ig.ImageGalleryId
                                       select new MegaProductImageVM
                                       {
                                           ig_Description = ig.ig_Description,
                                           ImageGalleryId = pi.ImageGalleryId
                                       }).OrderByDescending(i => i.ImageGalleryId)
               }).ToList();

        return query;
    }

Список продуктов ViewModel:

    namespace Project.ViewModels
    {
        [Serializable]
        public class ProductListVM : BaseViewModel
        {        
            public int ProductId { get; set; }        
            public int? ClientId { get; set; }
            public int? ProductTypeId { get; set; }
            public int? ProductStateId { get; set; }
            public String Name { get; set; }        
            public String Title { get; set; }
            public String Description { get; set; }
            public int? Quantity { get; set; }
            public int? Capacity { get; set; }        

            //PRODUCTIMAGE table fields
            public IEnumerable<MegaProductImageVM> newproductimages { get; set; }

            //RATECATEGORY table fields
            public IEnumerable<MegaRateCategoryVM> newratecategories { get; set; }

            //BOOKING table fields
            public IEnumerable<BookingVM> newbookings { get; set; }       

        }

    }

Что может быть причиной такого поведения? Может ли это быть вызвано настройкой порога запроса или настройкой сети в конфигурации базы данных MySql 5.5? Я не изменил ни одно из значений по умолчанию ни в одной из установок MySql 5.5. Я просто использую стандартный MySql Connector/Net 6.5.4 для доступа к БД вместе со стандартным Microsoft MVC 3, C#, Entity Framework 4, кодом LINQ-to-Entities.

Любая помощь в этом очень ценится. Спасибо, Atlas361

2 ответа

Решение

Я опубликовал свое приложение MVC для интернет-провайдера, так что любая потенциальная проблема, вызванная запросами через Интернет, была устранена, но у меня все еще была та же самая точная ошибка "Объект должен реализовывать IConvertible". После устранения неполадок это еще раз с совершенно неумелым персоналом службы поддержки Arvixe.com Я обнаружил, что действительной версией MySql, в которой была база данных, была версия 5.1.54, выпущенная в 2008 году, а не MySql 5.5, выпущенная в конце 2010 года. Согласно документации MySql, MySql Connector/Net 6.5.4 и Microsoft Entity Framework 4 совместимы, но я обнаружил, что это не так. После борьбы с Arvixe.com, чтобы поставить меня на сервер MySql 5.5, проблема ушла. Так что в итоге это была проблема совместимости версий.

Надеюсь, ответ поможет! Atlas361

Чтобы это исправить, добавьте "уважать двоичные флаги = ложь" в строку подключения, например:

connectionString="metadata=res://*/Something.csdl|res://*/Something.ssdl|
res://*/Something.msl;provider=MySql.Data.MySqlClient;
provider connection string=&quot;server=my-server;User Id=some-user;
Persist Security Info=True;database=some-database;respect binary flags=false&quot;"

Это известная проблема с определенными версиями MySQL 5.0 и 5.1

Существуют определенные ситуации, когда MySQL будет возвращать неверные метаданные об одном или нескольких столбцах... В случае, если изменения, необходимые для вашего приложения, будут слишком большими, добавление в поле подключения "уважения двоичных флагов = false" приводит к использованию соединителем предыдущее поведение: любой столбец, помеченный как строка, независимо от двоичных флагов, будет возвращен как строка. Только столбцы, которые специально помечены как BLOB, будут возвращены как BLOB.

Надеюсь, это поможет будущим путешественникам.

Другие вопросы по тегам