2013-03-07 84 views
0

运行我在生产服务器或其他开发人员计算机上编写的代码时,它会在此行上崩溃。使用LINQ to SQL和sqlmetal的C#错误System.InvalidCastException:指定的转换无效

Ac_CalcDetail xy = db.Ac_CalcDetails.Where(chld => chld.CalcIdent.Equals(CalcIdent)).First(); 

CalcIdent只是一个字符串guid。

我已经在我的本地数据库上运行sqlmetal,其中Ac_CalcDetail是我们的主表,用于创建此强类型代码和类Ac_CalcDetail。问题是当我在生产服务器上或其他开发人员的机器上运行代码时。我们一直在使用LINQ已经有一年多的时间了,从来没有任何问题如此困惑。以前我得到的例外非常明确地说明哪个字段缺失,这是非常明智的,但是从我的研究显然这个错误可能是某个字段有错误的数据类型。噩梦和完全不可能通过这个错误进行调试。

我认为目前唯一的解决方案是在SQL Server Management Studio中备份数据库,然后让其他人使用它。由于我们是一家小公司,我们倾向于只为自己的数据库做我们想做的事情,然后创建各种SQL脚本放在Dropbox文件夹中以使我们的数据库同步(或者至少是我们认为同步的)。不知道这是否意味着我们要么停止使用LINQ,要么开始使用一些更高级的SQL东西(SQL存储库或SQL数据库比较工具等)。

虽然这很奇怪,但我知道我们的数据库并没有完全相同的年龄(如果有的话),所以不知道为什么这个错误现在正在发生,为什么错误信息什么也没说!

+0

什么类型是'Ac_CalcDetails'和什么类型是'CalcIdent'? – SpaceBison 2013-03-07 14:02:52

+0

在上面的C#代码行中CalcIdent是一个字符串。在数据库中它是唯一标识符。我不认为这是问题,但其他开发人员使用我的数据库时没问题。 Ac_CalcDetails和Ac_CalcDetail由sqlmetal生成(很聪明,它知道如何从行类的表名中删除“s”)。将进入调试器,让你确切地知道 – Buswell 2013-03-07 14:10:58

+0

Ac_CalcDetails是一个使用泛型的表,并且类型为System.Data.Linq.Table 这些都是由使用sqlmetal的脚本自动创建的。所以在另一个开发人员的机器上,它会产生这个错误,但它可以通过以下方式修复: a)给我一个我的数据库的备份,然后他恢复,并且使用这个数据库来代替 b)让他在他的本地数据库上运行sqlmetal。但是当他检查新代码时,我得到了与我相同的错误 – Buswell 2013-03-07 14:15:59

回答

0

变化

Ac_CalcDetail XY

VAR XY

不是试图调试它。但显然看起来你有一些类型错误。

+0

欢呼Yahya,我想你是在那里的东西。说实话,我不知道为什么我一直没有使用匿名类型。现在我将使用导致它崩溃的相同数据库再次遍历我的代码,但使用“var”代替ac_calcDetails之类的任何类,并查看会发生什么。会后回欢呼 – Buswell 2013-03-08 11:59:23

+0

我这段代码运行时,得到完全相同的例外 'VAR XYZ =从db.Ac_CalcDetails CD,其中cd.CalcIdent.Equals(CalcIdent) 选择CD; VAR XY = xyz.First();'当我检查'xyz.First();'它是一个{e2Linq.Ac_CalcDetail}类型的类时,它看起来应该对我有效 – Buswell 2013-03-08 12:15:28

+0

如果它发生在'.First()' 在调试器中调用'xyz.First();'给出一个 ''xyz.First()'抛出了一个类型'System.InvalidCastException'的异常e2Linq.Ac_CalcDetail {System.InvalidCastException}' – Buswell 2013-03-08 12:25:11

相关问题