2009-07-23 1 views
2

У меня есть болезненно простая таблица, которая дает мне ошибку «Указанный приведение недействительна» при попытке удалить одну или несколько строк. Таблица имеет два столбца, «id» в качестве первичного ключа (INT) и «имя» (VARCHAR (20)), который сопоставляется с строкой в ​​файле dbml LINQ to SQL. Оба эти утверждения производят ошибку:LINQ to SQL delete производящий «Указанный приведение недействителен» ошибка

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

я итерация «MyTable» просто чтобы убедиться, что не было странных данных, и есть только две строки:

  • ID = 1, имя = "первый"
  • 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.

Что может быть причиной ошибки литья?

+1

Можете ли вы опубликовать трассировку стека исключений? Кроме того, сами ли методы Deletexxx() создают исключение, или это только на SubmitChanges()? –

+1

Есть ли какие-либо внешние ключи, и есть ли у вас какие-либо ассоциации в DBML-файле? – jason

+0

Это происходит на SubmitChanges. В базе данных нет внешних ключей, но я добавил ассоциацию в файле DBML в другую таблицу. Эта таблица является дочерним элементом другой таблицы. – gfrizzle

ответ

1

Хорошо, увидев обновление, проблема связана с вашими двумя таблицами. Это известный bug в .NET 3.5 SP1 и будет исправлен в .NET 4.0. Попробуйте свой код на бета-версии .NET 4.0, если сможете.

+0

Нет внешних ключей, но существует ассоциация (эта таблица является дочерним элементом другой таблицы). Когда я удаляю ассоциацию, я могу удалить ее, поэтому теперь возникает вопрос, почему ассоциация вызывает ошибку. – gfrizzle

+0

Да, это точная ошибка, с которой я сталкиваюсь. К счастью, мне удалось реорганизовать таблицу, чтобы использовать разные поля в ассоциации, чтобы достичь тех же результатов, чтобы обойти ее. Это очень полезно знать, поскольку это может произойти некоторое время, прежде чем мы сможем перейти на .NET 4.0. Благодарю. – gfrizzle

-2

Try:

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

Как-то я не думаю, что преобразование из VB в C# решит проблему. :) – gfrizzle

+0

oops sorry, nvm then =) – Francisco