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 у моего провайдера может как-то вызывать эта проблема по следующим причинам:
Если бы это была действительно проблема "Объект должен реализовывать IConvertible" в коде, тогда проблема сохранялась бы в коде и происходила бы независимо от того, какую установку БД я затрагивал.
Я полностью удалил и воссоздал базу данных у интернет-провайдера с рабочей копии моего локального ПК, но все равно получаю точно такую же ошибку.
Наиболее интересным является то, что запрос имеет 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="server=my-server;User Id=some-user;
Persist Security Info=True;database=some-database;respect binary flags=false""
Это известная проблема с определенными версиями MySQL 5.0 и 5.1
Существуют определенные ситуации, когда MySQL будет возвращать неверные метаданные об одном или нескольких столбцах... В случае, если изменения, необходимые для вашего приложения, будут слишком большими, добавление в поле подключения "уважения двоичных флагов = false" приводит к использованию соединителем предыдущее поведение: любой столбец, помеченный как строка, независимо от двоичных флагов, будет возвращен как строка. Только столбцы, которые специально помечены как BLOB, будут возвращены как BLOB.
Надеюсь, это поможет будущим путешественникам.