LinqToSql InvalidCastException - PullRequest
       0

LinqToSql InvalidCastException

1 голос
/ 20 сентября 2011

Хорошо, вот перечисление, верно?

    public enum BrandSafe : short
    {

        Yes = 1,
        No = -1,
        Unknown = 0

    }

Основной тип данных short, хорошо, пока все хорошо.

Вот таблица:

enter image description here

Теперь вот класс DTO:

public class VurlRow
{

    public long VurlRMXID { get; set; }
    public string VurlString { get; set; }
    public Enums.BrandSafe BrandSafe  { get; set; }


}

Наконец, вот метод linq:

        List<VurlRow> vurls = (from vurl in m_Context.Vurls
                     select new VurlRow()
                                {
                                    BrandSafe = (Enums.BrandSafe)vurl.BrandSafe,
                                    VurlRMXID = vurl.VurlRMXID,
                                    VurlString = vurl.VurlString

                                }).ToList();

Я также пробовал (перечисления.BrandSafe) Enum.ToObject (typeof (Enums.BrandSafe), vurl.BrandSafe) для создания Enum.Когда я удаляю строку BrandSafe = (Enums.BrandSafe) vurl.BrandSafe, вызов работает, но со строкой я получаю исключение InvalidCast.

"Указанное приведение недопустимо."

Похоже, что это должно быть полностью справедливо для меня, но что я знаю, недостаточно о enums и linq, очевидно, кто-нибудь может здесь помочь?

1 Ответ

3 голосов
/ 20 сентября 2011

BrandSafe - это tinyint в базе данных; tinyint отображается на byte, а не short. Это проблема. Сделай это:

public enum BrandSafe : byte
{
    Yes = 1,
    No = -1, // <====== see below
    Unknown = 0
}

(short будет соответствовать smallint)

Однако !!!! Обратите внимание, что -1 на самом деле не является допустимым значением для либо из byte / tinyint - это будет 255 или OverflowException в .NET (в зависимости от того, установлен он или нет) контекст) и арифметическое переполнение (ошибка 220) в базе данных.

Однако мне интересно, будут ли bool? (в C #) и bit null (TSQL) более подходящими.

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