Linq to SQL检索子表引发InvalidCastException
本文关键字:InvalidCastException to SQL 检索 Linq | 更新日期: 2023-09-27 18:19:30
我已经用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可以有多个字符。
尝试此操作时会发生什么?
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)
检查列的数据类型。很多时候,当您试图将列中的值分配给属性值时会出现此错误。
请尝试保持以下映射的一致性。
SQL.NETbit->booltinyint->字节smallint->shortint->intbigint->longdecimal->decimal货币->十进制float->double(首选)| float
还有其他不一致的映射会抛出相同的错误,但根据我的经验,这些是最常见的情况。
问题是,当LINQ-SQL填充您的属性值时,它只会分配值,而不会转换它,您会得到与尝试将short
值分配给int
属性相同的错误。
还要检查可能的空值。这些属性在类中应该是可以为null的。Nullable<int>
|int?
好吧,伙计们,我想我已经想好了!!!这真的很奇怪,我不知道为什么/发生了什么,但我确定了我的错误,现在可以纠正了。
我用sqlmetal生成了映射.dbml文件。接下来,当我把它添加到项目中时,我重命名了它。但我认为我重命名它不一致(在设计器中,它显示为myMeta,在cs文件中,它被命名为myDB,我在其他地方都使用myDB名称)。这就是所有问题开始发生的时候。当我把它改回原来的名字时,一切都没问题!