EF/Linq枚举错误

EF/Linq枚举错误,linq,entity-framework,Linq,Entity Framework,给定以下代码: public class RMAInfo { public enum RMAStatuses { Undefined = 0, Approved = 1, Denied = 2, Pending = 3, Received = 4, Closed = 5 } public enum ReturnLocations { Undefined = 0, Utah = 1, Indy = 2 } public RMAInf

给定以下代码:

public class RMAInfo
{
    public enum RMAStatuses {
        Undefined = 0, Approved = 1, Denied = 2,
        Pending = 3, Received = 4, Closed = 5
    }
    public enum ReturnLocations { Undefined = 0, Utah = 1, Indy = 2 }

    public RMAInfo()
    {
        ID = -1;
        RMACode = string.Empty;
    }

    public int ID { get; set; }
    public string RMACode { get; set; }
    public string ResellerID { get; set; }
    public RMAStatuses RMAStatus { get; set; }
}

private List<RMAInfo> GetRMAInfos_Internal(string resellerID)
{
    List<RMAInfo> returnRMAInfos = new List<RMAInfo>();

    using (Models.RMAEntities context = new Models.RMAEntities())
    {
        returnRMAInfos = (from r in context.RMAs
                          where r.ResellerID == resellerID
                          select new RMAInfo
                          {
                              ID = r.ID,
                              RMACode = r.RMACode,
                              ResellerID = r.ResellerID,
                              // error on next line!
                              RMAStatus = RMAInfo.RMAStatuses.Pending
                          }).ToList();
    }

    return returnRMAInfos;
}
公共类信息
{
公共枚举状态{
未定义=0,批准=1,拒绝=2,
挂起=3,接收=4,关闭=5
}
公共枚举返回位置{Undefined=0,Utah=1,Indy=2}
公共信息()
{
ID=-1;
RMACode=string.Empty;
}
公共int ID{get;set;}
公共字符串代码{get;set;}
公共字符串ID{get;set;}
公共RMA状态RMA状态{get;set;}
}
私有列表GetRMAInfos_内部(字符串转售商ID)
{
List returnRMAInfos=新列表();
使用(Models.RMAEntities context=new Models.RMAEntities())
{
returnRMAInfos=(来自context.RMAs中的r
其中r.ResellerID==ResellerID
选择新信息
{
ID=r.ID,
RMACode=r.RMACode,
转销商ID=r.RELESERID,
//下一行出错!
RMAStatus=RMAInfo.RMAStatuses.Pending
}).ToList();
}
返回信息;
}
我在分配到RMAStatus字段时出错。错误是

指定的值不是“Edm.Int32”类型的实例

如果我把这句话注释掉,效果很好

我也尝试过在不使用EF的情况下编写同样的代码,它似乎工作得很好


有什么想法吗?

实体框架不喜欢枚举,因为它无法将其转换为SQL。您需要公开EF设置基础
int
值的方法,或者在EF使用完该值后,您必须自己设置该值

您可能要做的是公开一个
int
属性来设置它。如果愿意,您可以将其限制为内部访问,以便调用方可能看不到它,但您的EF代码可以看到它(假设调用方位于不同的程序集中,但您的上下文不在其中)。那你就可以了

public class RMAInfo 
{
    ///<summary>
    /// Integer representation of RMAStatus
    ///</summary>
    internal int RMAStatusCode 
    { 
        get { return (int)this.RMAStatus; } // you could omit the getter
        set { this.RMAStatus = (RMAInfo.RMAStatuses)value; } 
    }
} 

...

select new RMAInfo 
{
     ...
     RMAStatusCode = (int)RMAInfo.RMAStatuses.Pending
}
公共类信息
{
///
///状态的整数表示
///
内部整数状态码
{ 
get{return(int)this.RMAStatus;}//可以省略getter
设置{this.RMAStatus=(RMAInfo.RMAStatuses)值;}
}
} 
...
选择新信息
{
...
RMAStatusCode=(int)RMAInfo.RMAStatuses.Pending
}

为了避免这种情况,您基本上可以选择您的RMAInfo SAN状态,然后对结果进行迭代,将每个状态设置为“挂起”,将EF完全排除在外。

安装.Net 4.5似乎也可以解决此问题(您的项目仍然可以在4.0上)


我在登台服务器上遇到了这个问题(开发和测试服务器工作正常),发现它没有安装.NET4.5。安装了4.5后,问题就解决了,没有任何代码更改。

跟进。。。我认为这仍然是懒惰的,甚至调用这个属性?@Scottie,它应该不会比您使用EF来填充对象所编写的其他内容更急切。请记住,在您的问题中,您使用的是
.ToList()
,无论您使用的是什么提供程序(-EF,-Objects,等等),这都是非常迫切的。啊,对了!我将其修改为使用IEnumerable而不是ToList以保持其惰性。再次感谢!EF5中添加了枚举支持,它需要.NET4。5@MystereMan我们还没有升级到EF5。只要服务器上安装了.NET4.5,EF4似乎就可以很好地处理枚举。