2012-01-03 73 views
2

我有数据库与Linq-To-Sql类映射。我试着对它执行一些基本的查询,当我尝试访问子表时,它会失败并返回InvalidCastException。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.字符表通过外键链接到UserAccounts。一个UserAccount可以有多个字符。

+0

你使用什么提供者?你在输出中看到* real * SQL查询吗? – Tigran 2012-01-03 10:19:20

+1

我不确定我们在这里有足够的信息;你可以访问一个单独的'Character'记录,即'var char = db.Characters.First()'?我不知道这是不是一个简单的列错误配置(长vs int,或者是一个狡猾的枚举值等) – 2012-01-03 10:24:59

+1

不相关:'p.Password'设置的闹钟声音....应该是一个盐味散列,真的 – 2012-01-03 10:25:30

回答

0

好吧,我想我想通了!它真的很奇怪,我不知道为什么/发生了什么,但我确定了我的错误,现在可以修复它。

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

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 

(注变种不是int)

+0

同样的例外。更有趣的是,当我将鼠标放在UA.Characters(或添加监视表达式)上时,它会给出InvalidCastException,但是如果在VS中按下Resume几次,它将检索正确的值(它是2)并且正常进行。 – 2012-01-03 10:33:50

+0

<稻草离合器>数据上下文/型号是最新的吗?也许从数据库中回来的东西并不完全相加......尝试重新从DB重新拖动所有东西? plenderj 2012-01-03 18:10:12

0

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

尝试保持以下映射一致。

 
SQL   .NET 

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

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

问题是,当LINQ-SQL填充你的属性值时,它只是分配值而不转换它,你会得到同样的错误,就好像你试图给int属性赋值short值一样。

还检查可能的空值。这些属性应该在你的类中可以为空。 Nullable<int> | int?