Linq-to-SQL检索子表会抛出InvalidCastException

时间:2012-01-03 10:15:53

标签: c# sql linq

我使用Linq-To-Sql类映射数据库。我尝试对它执行一些基本查询,当我尝试访问子表时,它会因InvalidCastException而失败。

var query = (from p in PBZGdb.Instance.AuthenticationDatas
                     where p.Username == "Misha" && p.Password == "123"
                     select new { p.UserAccount }).AsEnumerable();

UserAccount UA = query.ElementAt(0).UserAccount; //this works!
int count = UA.Characters.Count(); //throws InvalidCastException here

var query = (from p in PBZGdb.Instance.AuthenticationDatas
                     where p.Username == "Misha" && p.Password == "123"
                     select new
                     {
                         p.UserAccount,
                         p.UserAccount.Characters
                     }) .AsEnumerable();

UserAccount UA = query.ElementAt(0).UserAccount; //throws InvalidCastException here

如果我在几秒钟后异常暂停应用程序后尝试继续,它会“检索”数据并且没有问题。有没有人遇到过这样的事情?我该如何解决?

P.S。 Characters表与UserAccounts链接到外键。 UserAccount可以有多个字符。

3 个答案:

答案 0 :(得分:0)

尝试此操作会发生什么?

var query = (from p in PBZGdb.Instance.AuthenticationDatas
                 where p.Username == "Misha" && p.Password == "123"
                 select new { p.UserAccount }).AsEnumerable();

UserAccount UA = query.ElementAt(0).UserAccount; //this works!
var count = UA.Characters.Count(); //throws InvalidCastException here

(注意var而不是int)

答案 1 :(得分:0)

检查列数据类型。在尝试将列中的值分配给属性值时,很多时候会出现此错误。

尝试保持以下映射一致。

SQL          .NET

bit       -> bool
tinyint   -> byte
smallint  -> short
int       -> int
bigint    -> long
decimal   -> decimal
money     -> decimal
float     -> double (preferred) | float

还有其他不一致的映射会引发相同的错误,但根据我的经验,这些是最常见的情况。

问题是,当LINQ-SQL填充您的属性值时,它只是分配值而不转换它,您将得到相同的错误,就像您尝试将short值分配给int一样} property。

同时检查可能的空值。这些属性应该是您的类中的nullables。 Nullable<int> | int?

答案 2 :(得分:0)

好的家伙,我想我想到了!它真的很奇怪,我不知道为什么/发生了什么,但我查明了我的错误,现在可以修复它。

我使用sqlmetal生成了我的映射.dbml文件。接下来,当我将它添加到项目中时,我重命名了它。但我认为我不一致地重命名它(在设计器中它显示为myMeta,在cs文件中它被命名为myDB,我在其他地方使用myDB名称)。当所有问题都开始发生时。一旦我将其改回原名,一切都没有问题!