运行我在生产服务器或其他开发人员计算机上编写的代码时,它会在此行上崩溃。使用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数据库比较工具等)。
虽然这很奇怪,但我知道我们的数据库并没有完全相同的年龄(如果有的话),所以不知道为什么这个错误现在正在发生,为什么错误信息什么也没说!
什么类型是'Ac_CalcDetails'和什么类型是'CalcIdent'? – SpaceBison 2013-03-07 14:02:52
在上面的C#代码行中CalcIdent是一个字符串。在数据库中它是唯一标识符。我不认为这是问题,但其他开发人员使用我的数据库时没问题。 Ac_CalcDetails和Ac_CalcDetail由sqlmetal生成(很聪明,它知道如何从行类的表名中删除“s”)。将进入调试器,让你确切地知道 – Buswell 2013-03-07 14:10:58
Ac_CalcDetails是一个使用泛型的表,并且类型为System.Data.Linq.Table 这些都是由使用sqlmetal的脚本自动创建的。所以在另一个开发人员的机器上,它会产生这个错误,但它可以通过以下方式修复: a)给我一个我的数据库的备份,然后他恢复,并且使用这个数据库来代替 b)让他在他的本地数据库上运行sqlmetal。但是当他检查新代码时,我得到了与我相同的错误 –
Buswell
2013-03-07 14:15:59