EF / Linq enum error - PullRequest
       3

EF / Linq enum error

4 голосов
/ 13 сентября 2011

С учетом следующего кода:

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 ]

4 голосов
/ 13 сентября 2011

Entity Framework не нравится перечисление, так как не может перевести его на 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, а затем выполните итерацию по результату, чтобы установить для каждого статуса статус отложенного, полностью исключив EF.

1 голос
/ 03 сентября 2013

Установка .Net 4.5, по-видимому, также устраняет проблему (ваш проект все еще может быть на 4.0).

У меня была эта проблема на нашем промежуточном сервере (dev и тестовые серверы работали нормально) и обнаружил, чтона нем не было установлено .Net 4.5.После установки 4.5 проблема исчезла без каких-либо изменений кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...