EF / Linq枚举错误

时间:2011-09-13 17:11:25

标签: 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 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;
}

我在RMAStatus字段的分配上收到错误。错误是

  

指定的值不是'Edm.Int32'

类型的实例

如果我注释掉那一行,它就可以了。

我还试图在不使用EF的情况下执行相同的代码,它似乎工作正常。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

实体框架不喜欢枚举,因为它无法将其转换为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
}

为了避免这种情况,你基本上会选择你的RMAInfo sans状态,然后迭代结果将每个状态设置为pending,将EF完全保留在其中。

答案 1 :(得分:1)

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

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