实体框架映射枚举:指定的值不是'Edm.Int32'类型的实例参数名称:value

时间:2012-04-03 09:06:25

标签: entity-framework entity-framework-4 enums expression

我正在尝试将实体框架查询的结果返回到我自己的dto类中,同时映射我的枚举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 个答案:

答案 0 :(得分:10)

来自实体框架预测(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完成的,这是一项例行工作。


修改

作为一个迟到的事后,我想补充说,当有问题的表有很多列时,只有一个愚蠢的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
                 }).

答案 1 :(得分:9)

安装.Net 4.5似乎也解决了这个问题(你的项目仍然可以在4.0上)。

我在我们的登台服务器上遇到此问题(开发和测试服务器工作正常)并发现它没有安装.Net 4.5。一旦我安装了4.5,问题就会在没有任何代码更改的情况下解决。

答案 2 :(得分:0)

尝试更新实体时出现此错误,我添加了此答案,因为此问题是搜索该错误时的最高结果。对于更新,这是由于MySQL连接器中的错误引起的:

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

它似乎影响6.0.3及更低版本:

  

请参阅适用于.Net的6.0.3 MySQL连接器的发行说明

     

它通知EF int不支持unsigned int   版本。

(对我来说)最简单的解决方法是将要更改的列更改为未签名的列。