2008-11-05 6 views
3

j'ai une base de données simple:Suppression d'un enregistrement dans LINQ avec des clés étrangères - invalides cast exception

ARTICLE 
---------- 
ArticleId (PK), 
ArticleTitle 
..other stuff... 

USER-ARTICLE 
------------ 
ArchiveId (PK), 
UserId, 
ArticleId 
..other stuff... 

Les articleId « s sont des clés étrangères.

Je veux être en mesure de supprimer un article utilisateur ligne par UserArticleId en utilisant le code suivant,

UserArticle myobjtodelete = PersonalArchiveDb.UserArticles.Single(ua => ua.ArchiveId == 3); 
PersonalArchiveDb.UserArticles.DeleteOnSubmit(myobjtodelete); 
PersonalArchiveDb.SubmitChanges(); 

(Oui, je suis conscient que je peux faire la déclaration à l'intérieur de la suppression plutôt que de récupérer l'objet, il était pour des fins de débogage pour vous assurer que l'objet existe bel et bien - il le fait)

Lorsque le débogueur frappe la ligne SubmitChanges(), je reçois une erreur d'exécution.

Specified cast is not valid.

Voici la trace de la pile,

at System.Data.Linq.IdentityManager .StandardIdentityManager .SingleKeyManager`2.TryCreateKeyFromValues(Object[] values, V& v) at System.Data.Linq.IdentityManager.StandardIdentityManager.IdentityCache`2.Find(Object[] keyValues) at System.Data.Linq.IdentityManager.StandardIdentityManager.Find(MetaType type, Object[] keyValues) at System.Data.Linq.CommonDataServices.GetCachedObject(MetaType type, Object[] keyValues) at System.Data.Linq.ChangeProcessor.GetOtherItem(MetaAssociation assoc, Object instance) at System.Data.Linq.ChangeProcessor.BuildEdgeMaps() at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges() at Driver_SOC_ASO.Controls.PersonalArchive.ArchiveListing.grdArchive_RowDeleting(Object sender, GridViewDeleteEventArgs e) in C:\work\Driver.Net\Driver-SOC-ASO\Driver-SOC-ASO\Controls\PersonalArchive\ArchiveListing.ascx.cs:line 78 at System.Web.UI.WebControls.GridView.OnRowDeleting(GridViewDeleteEventArgs e) at System.Web.UI.WebControls.GridView.HandleDelete(GridViewRow row, Int32 rowIndex) at System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) at System.Web.UI.WebControls.GridView.RaisePostBackEvent(String eventArgument) at System.Web.UI.WebControls.GridView.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Je suis à une perte, des idées?

+0

Votre exemple de code utilise "ArchiveId" plutôt que "ArticleId" - dans votre description originale, voulez-vous dire "Archive" au lieu de "Article"? –

+0

Ouais désolé, là UserArticleId == ArchiveId, appellation pauvres je sais Sera éditer – qui

Répondre

0
Réglage

try ON CASCADE deletepour ArticleId

1

Cela peut être un exemple de ce bug, que Microsoft dit est fixé dans .NET 4.0.

0

Dans votre dbml, vérifiez s'il existe une association incorrecte en b/w Article et UserArticle.

Questions connexes