2009-07-23 28 views
2

1つ以上の行を削除しようとすると「指定されたキャストは無効です」というエラーが表示されます。このテーブルには、主キー(INT)としての "id"と、LINQ to SQL dbmlファイルの文字列にマップされる "名前"(VARCHAR(20))の2つの列があります。これらのステートメントの両方がエラーを生成:=LINQ to SQL削除 "指定されたキャストが無効です"エラー

  • ID = 1、名前:

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

    私は何も変なデータがなかったことを確認するために、「MyTableという」を通じて繰り返し、そして唯一の2つの行があります"最初の"

  • ID = 2、NAME = "第二"

例外がで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

いいえ、アップデートを見て、問題は2つのテーブルの間の関連付けです。これは.NET 3.5 SP1で既知のbugであり、.NET 4.0で修正される予定です。可能であれば、.NET 4.0 Betaでコードを試してみてください。

+0

外部キーはありませんが、関連付けがあります(このテーブルは別のテーブルの子です)。アソシエーションを削除すると削除できますので、アソシエーションがエラーの原因になっているのが今の質問です。 – gfrizzle

+0

うん、これは私が打っている正確なバグです。幸いにも私はテーブルをリファクタリングして、関連するさまざまなフィールドを使用して同じ結果を得ることができました。これは、.NET 4.0に移行するまでにはしばらく時間がかかる可能性があるため、わかりやすいものです。ありがとう。 – gfrizzle

-2

試してみてください。

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

何とか私はVBからC#への変換が問題を解決するとは思わない。 :) – gfrizzle

+0

oops申し訳ありません、nvm then =) – Francisco

関連する問題