2011-09-20 186 views
1

好的,這裏是一個枚舉,對吧?LinqToSql InvalidCastException

public enum BrandSafe : short 
    { 

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

    } 

基本的數據類型短,OK,到目前爲止好。

這裏有一個表:

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顯然不夠,任何人都可以幫忙嗎?

+0

嘗試'(Enums.BrandSafe)(short)vurl.BrandSafe' – Dyppl

+0

vurl.BrandSafe是一個簡短的例子。 – cerhart

+0

你能提供一個完整的異常信息嗎? – Dyppl

回答

3

BrandSafetinyint在數據庫中; tinyint映射到byte,而不是short。那就是問題所在。讓它:

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

short將映射到smallint

然而!!!!需要注意的是-1是不是真的byte/tinyint要麼法律價值 - 這將是255或.NET的OverflowException(取決於它是否是選中或取消選中上下文),以及運算溢出(錯誤220)在數據庫中。

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

+0

當然!咄!我在DBML中改變了它,但我想我忘了更改表格。感謝您的幫助,也讓我覺得自己像一個白癡:) – cerhart

+0

@cerhart另請參閱我添加的最後一行 –

+0

對,我已經使它成爲一個小int,但後來我決定我想用-1作爲一個值,然後我將DBML改爲short,但忘記將table的值設置爲int int。然後,我只是拒絕看看答案。選擇性失明。 – cerhart