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

Entity framework 实体框架映射枚举:指定的值不是“Edm.Int32”类型的实例参数名称:值,entity-framework,entity-framework-4,enums,expression,Entity Framework,Entity Framework 4,Enums,Expression,我试图将实体框架查询的结果返回到我自己的dto类中,同时映射我的enum TradeType 我得到以下错误 指定的值不是“Edm.Int32”类型的实例参数名称:value 知道如何修复或解决问题吗 谢谢 public IEnumerable<Trade> GetLiveTrades(string routeName) { return _entities.Price.Where(p => p.StatusCode.Equals("A") && p.P

我试图将实体框架查询的结果返回到我自己的dto类中,同时映射我的enum TradeType

我得到以下错误

指定的值不是“Edm.Int32”类型的实例参数名称:value

知道如何修复或解决问题吗

谢谢

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; }
}

从实体框架投影选择投影中的枚举是一个已知问题。如果你这样做

_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 ...

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


我在我们的登台服务器dev和测试服务器上遇到了这个问题,发现它没有安装.NET4.5。一旦我安装了4.5,问题就解决了,没有任何代码更改。

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

它似乎会影响6.0.3及以下版本:

请参阅6.0.3 MySQL Connector for.Net的发行说明

它通知此EF int不支持无符号int 版本


对我来说,最简单的修复方法是将列更改为有符号的,而不是无符号的。

谢谢,我通过将dto更改为一个内部变量来解决这个问题,该变量存储PriceTypeCode的原始文本版本,然后我公开了一个公共属性,该属性执行切换以返回正确的枚举。虽然有点粗糙,但它达到了预期的效果!:。为你的答案干杯,我将继续使用你的方法。Thanx这帮助我解决了我的问题,我将代码更改为将枚举串入查询外部的局部变量,这为我解决了问题。嗨@John。你的评论再次引起了我对这篇文章的注意,并敦促我再加上一点思考。那么AsEnumerable允许你对对象使用linq而不必对数据库执行吗?这很酷这是对的,随着时间的推移,这将成为这个问题的答案。这如何解决Windows XP机器上的问题?@BitOriented您是否认为在新版本的.Net中修复错误是一个不太可取的解决方案,而不是使用您自己的解决方案,因为旧的、不受支持的,非服务器环境无法实现它?呃,这个错误不是发生在我的本地机器上,而是发生在服务器上。在我的环境中,所有这些都取决于您的环境。我能够快速地解决代码问题,并在发生此错误的DEV服务器上部署一个新的DLL,这比要求其他人更新此DEV服务器的.NET framework要快,否则我无法控制它。耶!
_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
                 }).