【问题标题】:LINQ to SQL delete producing "Specified cast is not valid" errorLINQ to SQL 删除产生“指定的转换无效”错误
【发布时间】:2014-08-11 15:12:54
【问题描述】:

我有一个非常简单的表,当我尝试删除一行或多行时,它给我一个“指定的强制转换无效”错误。该表有两列,“id”作为主键 (INT),“名称”(VARCHAR(20)) 映射到 LINQ to SQL dbml 文件中的字符串。这两个语句都会产生错误:

dc.DeleteOnSubmit(dc.MyTables.Where(Function(x) x.id = 1).SingleOrDefault)
dc.DeleteAllOnSubmit(dc.MyTables)

我遍历“MyTable”只是为了确保没有奇怪的数据,并且只有两行:

  • id = 1, name = "first"
  • id = 2,名称 = “秒”

SubmitChanges 上发生异常。这是堆栈跟踪:

[InvalidCastException: Specified cast is not valid.]
   System.Data.Linq.SingleKeyManager`2.TryCreateKeyFromValues(Object[] values, V& v) +59
   System.Data.Linq.IdentityCache`2.Find(Object[] keyValues) +28
   System.Data.Linq.StandardIdentityManager.Find(MetaType type, Object[] keyValues) +23
   System.Data.Linq.CommonDataServices.GetCachedObject(MetaType type, Object[] keyValues) +48
   System.Data.Linq.ChangeProcessor.GetOtherItem(MetaAssociation assoc, Object instance) +142
   System.Data.Linq.ChangeProcessor.BuildEdgeMaps() +233
   System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) +59
   System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +331
   System.Data.Linq.DataContext.SubmitChanges() +19
   InpatientCensus.MaintenanceController.DeleteSoleCommunity(Int32 id) in C:\Documents and Settings\gregf\My Documents\Projects\InpatientCensus\InpatientCensus\Controllers\MaintenanceController.vb:14
   lambda_method(ExecutionScope , ControllerBase , Object[] ) +128
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +178
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +24
   System.Web.Mvc.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7() +52
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +254
   System.Web.Mvc.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +192
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +399
   System.Web.Mvc.Controller.ExecuteCore() +126
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +27
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +151
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +57
   System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +7
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

删除添加到 DBML 文件的关联允许删除行。为什么关联会导致错误?关联的列都是数据库中的 VARCHAR(20) 并解析为 DBML 文件中的字符串。

什么可能导致转换错误?

【问题讨论】:

  • 你能发布异常堆栈跟踪吗?另外,Deletexxx() 方法本身是否会产生异常,还是仅在 SubmitChanges() 上产生异常?
  • DBML 文件中是否有外键和关联?
  • 发生在 SubmitChanges 上。数据库中没有外键,但我确实将 DBML 文件中的关联添加到另一个表。此表是另一个表的子表。
  • 你的表名真的是MyTables吗?看起来非常元。 ;)
  • 该表的名称实际上是“SoleCommunityHospital”,但我试图将问题简化为本质。

标签: vb.net linq linq-to-sql delete-row


【解决方案1】:

好的,看到更新后,问题在于您的两个表之间的关联。这是 .NET 3.5 SP1 中已知的 bug,将在 .NET 4.0 中修复。如果可以,请在 .NET 4.0 Beta 上试用您的代码。

【讨论】:

  • 没有外键,但是有关联(这个表是另一个表的子表)。当我删除关联时,我可以删除,所以现在的问题是关联导致错误的原因。
  • 是的,这正是我遇到的错误。幸运的是,我能够重构表以使用关联中的不同字段来获得相同的结果来绕过它。知道这一点非常好,因为我们可能需要一段时间才能迁移到 .NET 4.0。谢谢。
【解决方案2】:

我们遇到了类似的问题,由使用非整数键引起。详细信息和修补程序编号在这里:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=351358

【讨论】:

  • 我只删除了我的链接关系并且工作正常,就像你的文章建议的那样。
【解决方案3】:

试试:

dc.MyTables.DeleteOnSubmit(dc.MyTables.SingleOrDefault(x=>x.id==1));
dc.MyTables.DeleteAllOnSubmit(dc.MyTables);

【讨论】:

  • 不知何故,我认为从 VB 转换为 C# 并不能解决问题。 :)
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多