我使用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可以有多个字符。
答案 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名称)。当所有问题都开始发生时。一旦我将其改回原名,一切都没有问题!