Перечисление сопоставления инфраструктуры сущностей: указанное значение не является экземпляром типа Edm.Int32 Имя параметра: значение - PullRequest
9 голосов
/ 03 апреля 2012

Я пытаюсь вернуть результат запроса структуры сущностей в свой собственный класс dto одновременно с отображением моего enum TradeType.

Я получаю следующую ошибку

Указанное значение не является экземпляром типа 'Edm.Int32' Имя параметра: значение

Есть идеи как исправить или обойти?

Спасибо

public IEnumerable<Trade> GetLiveTrades(string routeName)
{
    return _entities.Price.Where(p => p.StatusCode.Equals("A") && p.Period.PeriodYear <= DateTime.Now.Year+1 && p.Route.RouteCode.Equals(routeName)).
        Select(p => new Trade
                        {
                            Volume = (long) (p.Volume ?? 100), 
                            TradeType = (p.PriceTypeCode.Equals("O") ? TradeType.Seller : TradeType.Bidder),
                            Price = p.Price1,
                            TenorStartDate = p.Period.PeriodStartDate.Value,
                            TenorEndDate = p.Period.PeriodStartDate.Value,
                            TradeId = p.ID
                        }).ToList();
        }

public class Trade
{
    public long Volume { get; set; }
    public TradeType TradeType { get; set; }
    public double Price { get; set; }
    public DateTime TenorStartDate { get; set; }
    public DateTime TenorEndDate { get; set; }
    public Guid TradeId { get; set; }
}

Ответы [ 3 ]

10 голосов
/ 04 апреля 2012

Перечисления в проекциях из проекций Entity Framework (Select) - известная проблема. Если вы делаете

_entities.Price.Where(p => p.StatusCode.Equals("A") &&
    p.Period.PeriodYear <= DateTime.Now.Year + 1 &&
    p.Route.RouteCode.Equals(routeName)).ToList() // ToList !
    .Select(p => new Trade ...

проекция выполняется обычным linq-to-objects, что является обычной работой.


EDIT

В качестве поздней запоздалой мысли я хотел бы добавить, что просто тупой ToList() может быть вредным, если в рассматриваемой таблице много столбцов. Это будет означать, что клиенту передается гораздо больше данных, чем необходимо. В таких случаях может быть полезно сделать двойную проекцию . Во-первых, в рамках проекта поставщика запросов к принятым типам. Затем, после переключения на linq-to-objects (AsEnumerable), проект в окончательный тип:

_entities.Price.Where(p => p.StatusCode.Equals("A") &&
    p.Period.PeriodYear <= DateTime.Now.Year + 1 &&
    p.Route.RouteCode.Equals(routeName))
    .Select(p => new 
                {
                  Volume = (long) (p.Volume ?? 100), 
                  PriceTypeCode = p.PriceTypeCode,
                  Price = p.Price1,
                  TenorStartDate = p.Period.PeriodStartDate.Value,
                  TenorEndDate = p.Period.PeriodStartDate.Value,
                  TradeId = p.ID
                })
    .AsEnumerable()
    .Select(x => new Trade
                 {
                   Volume = x.Volume, 
                   TradeType = (x.PriceTypeCode.Equals("O") ? TradeType.Seller : TradeType.Bidder),
                   Price = x.Price1,
                   TenorStartDate = x.TenorStartDate,
                   TenorEndDate = x.TenorEndDate,
                   TradeId = x.ID
                 }).
9 голосов
/ 03 сентября 2013

Установка .Net 4.5, по-видимому, также решает проблему (ваш проект все еще может быть на 4.0).

У меня была эта проблема на нашем промежуточном сервере (dev и тестовые серверы работали нормально) и обнаружил, что на нем не установлено .Net 4.5. После установки 4.5 проблема исчезла без каких-либо изменений кода.

0 голосов
/ 03 января 2019

Я получил эту ошибку при попытке обновить сущности, я добавляю этот ответ, потому что этот вопрос является лучшим результатом при поиске этой ошибки.Для обновления это связано с ошибкой в ​​MySQL Connector:

https://bugs.mysql.com/bug.php?id=44801

Похоже, что это влияет на версию 6.0.3 и ниже:

См.Примечания к выпуску 6.0.3 MySQL Connector для .Net

Он сообщает, что неподписанные int не поддерживаются для EF int этой версии.

Самым простым исправлением (для меня) было:измените столбец для подписи вместо неподписанного.

...