LinqToSql InvalidCastException

时间:2011-09-20 08:16:16

标签: c# linq-to-sql enums

好的,所以这是一个枚举,对吧?

    public enum BrandSafe : short
    {

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

    }

基础数据类型简短,好,到目前为止一直很好。

这是一张表:

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();

我也尝试过(Enums.BrandSafe)Enum.ToObject(typeof(Enums.BrandSafe),vurl.BrandSafe)来生成Enum。当我删除BrandSafe =(Enums.BrandSafe)vurl.BrandSafe这一行时,调用可以正常工作,但是在行中我得到了一个InvalidCast异常。

“指定的演员表无效。”

似乎它对我来说应该是完全有效的,但是我知道什么,显然,关于enums和linq的不够,这里的任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

数据库中

BrandSafetinyint; tinyint映射到byte,而不是short。那就是问题所在。成功:

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

short将映射到smallint

然而!!!!请注意,-1对{strong> byte / tinyint并非真正合法的价值 - 在.NET中它将是255或OverflowException(取决于它是否是已检查或未检查的上下文),以及数据库中的算术溢出(错误220)。

但是,我确实想知道bool?(在C#中)和bit null(TSQL)是否会更好地匹配。