C# Linq到SQL检索子表引发InvalidCastException

C# Linq到SQL检索子表引发InvalidCastException,c#,sql,linq,C#,Sql,Linq,我使用Linq将数据库映射到Sql类。我尝试对它执行一些基本查询,但当我尝试访问子表时,它因InvalidCastException而失败 var query = (from p in PBZGdb.Instance.AuthenticationDatas where p.Username == "Misha" && p.Password == "123" select new { p.UserA

我使用Linq将数据库映射到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

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


p、 字符表通过外键链接到UserAccounts。用户帐户可以有多个字符。

尝试此操作时会发生什么

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)

尝试此操作时会发生什么

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 .NET bit -> bool tinyint -> byte smallint -> short int -> int bigint -> long decimal -> decimal money -> decimal float -> double (preferred) | float SQL.NET 比特->布尔 tinyint->byte smallint->short 整数->整数 bigint->long 十进制->十进制 货币->十进制 浮动->双(首选)|浮动 还有其他不一致的映射会抛出相同的错误,但根据我的经验,这些是最常见的情况

问题是,当LINQ-SQL填充属性值时,它只分配值,而不进行转换,并且您将得到与尝试将
short
值分配给
int
属性相同的错误


还要检查可能的空值。这些属性在类中应该是可为空的<代码>可空|
int?

检查列数据类型。在尝试将列中的值指定给属性值时,经常会出现此错误

尝试保持以下映射的一致性

SQL .NET bit -> bool tinyint -> byte smallint -> short int -> int bigint -> long decimal -> decimal money -> decimal float -> double (preferred) | float SQL.NET 比特->布尔 tinyint->byte smallint->short 整数->整数 bigint->long 十进制->十进制 货币->十进制 浮动->双(首选)|浮动 还有其他不一致的映射会抛出相同的错误,但根据我的经验,这些是最常见的情况

问题是,当LINQ-SQL填充属性值时,它只分配值,而不进行转换,并且您将得到与尝试将
short
值分配给
int
属性相同的错误


还要检查可能的空值。这些属性在类中应该是可为空的<代码>可空的|
int?

好的,伙计们,我想我已经猜到了!!!这真的很奇怪,我不知道为什么/发生了什么,但我指出了我的错误,现在可以纠正了


我用sqlmetal生成了mapping.dbml文件。接下来,当我将其添加到项目中时,我将其重命名。但我认为我对它的重命名不一致(在designer中它显示为myMeta,在cs文件中它命名为myDB,而我在其他地方都使用myDB名称)。这就是所有问题开始发生的时候。只要我把它改回原来的名字,一切都没问题

好了,伙计们,我想我明白了!!!这真的很奇怪,我不知道为什么/发生了什么,但我指出了我的错误,现在可以纠正了


我用sqlmetal生成了mapping.dbml文件。接下来,当我将其添加到项目中时,我将其重命名。但我认为我对它的重命名不一致(在designer中它显示为myMeta,在cs文件中它命名为myDB,而我在其他地方都使用myDB名称)。这就是所有问题开始发生的时候。只要我把它改回原来的名字,一切都没问题

您使用哪种提供商?您在输出中看到*real*SQL查询了吗?您的密码字段是什么类型的?我不确定这里是否有足够的信息;您能否访问单个
字符
记录,即
var char=db.Characters.First()
?我想知道这是否仅仅是一个配置错误的列(long vs int,或者是一个不可靠的枚举值,等等),与此无关:
p.Password
报警声音集。。。。应该是咸土豆条,really@MichaelNaumov在我看来,数据中的列不匹配。仔细检查所有列/属性映射是否键入正确(特别是容易被忽略的枚举)。您使用什么提供程序?您在输出中看到*real*SQL查询了吗?您的密码字段是什么类型的?我不确定这里是否有足够的信息;您能否访问单个
字符
记录,即
var char=db.Characters.First()
?我想知道这是否仅仅是一个配置错误的列(long vs int,或者是一个不可靠的枚举值,等等),与此无关:
p.Password
报警声音集。。。。应该是咸土豆条,really@MichaelNaumov在我看来,数据中的列不匹配。仔细检查所有列/属性映射的类型是否正确(特别是容易被忽略的枚举)。同样的异常。更有趣的是,当我将鼠标移到UA.Characters(或添加watch表达式)上时,它将给出InvalidCastException,但如果在VS中按Resume几次,它将检索正确的值(即2)并继续正常运行。数据上下文/模型是最新的吗?也许从数据库中得到的信息不太符合逻辑。。。再次尝试从数据库中重新拖动所有内容?相同的异常。更有趣的是,当我将鼠标移到UA.Characters(或添加watch表达式)上时,它将给出InvalidCastException,但如果在VS中按Resume几次,它将检索正确的值(即2)并继续正常运行。数据上下文/模型是最新的吗?也许从数据库中得到的信息不太符合逻辑。。。是否再次尝试从数据库中重新拖动所有内容?