给出以下代码:
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的情况下执行相同的代码,它似乎工作正常。
有什么想法吗?
答案 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,问题就会在没有任何代码更改的情况下解决。