2011-09-13 131 views
4

考慮下面的代碼:EF/LINQ的枚舉錯誤

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,它似乎工作正常。

任何想法?

回答

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狀態,然後遍歷結果每個狀態設置爲掛起,EF留下了它完全。

+0

此代碼完美工作!謝謝!! – Scottie

+0

跟進...我認爲這仍然是懶惰的,甚至稱這個屬性? – Scottie

+0

@Scottie,它*不應該比你用EF填充你的對象的東西更加渴望。請記住,在你的問題中,你正在使用'.ToList()',無論你使用什麼提供者(-EF,-Objects等),它都是非常渴望的。 –

1

安裝.Net 4.5似乎也解決了這個問題(您的項目仍然可以在4.0上)。

我在暫存服務器上(開發和測試服務器工作正常)有這個問題,並發現它沒有安裝.Net 4.5。一旦我安裝了4.5,問題就清除了,沒有任何代碼更改。

+0

EF5中增加了Enum支持,這需要.NET 4.5 –

+0

@MystereMan我們還沒有升級到EF5。只要.Net 4.5安裝在服務器上,EF4似乎對Enums就可以了。 –