2011-05-12 5 views
0

J'ai une entité LINQ comme ceci:LINQ: IndexOutOfRangeException

ID1 INT 
ID2 INT 
ID3 INT 
Value VARCHAR(50) 

ID1, ID2 & ID3 sont les clés primaires composites. Il n'a aucune association avec une autre entité.

Un IndexOutOfRangeException est lancé chaque fois que je mets à jour ou supprimer après SubmitChanges. Je cours sur .NET 3.5 SP1.

J'ai essayé de créer un autre projet, toujours sur .NET 3.5 SP1, mais je ne rencontre pas cette exception.

Voici le code:

 DataClasses context = new DataClasses(); 
     Entity entity = (from entities in context.Entities 
           where entities.ID1 == 3 
           && entities.ID2 == 1 
           && entities.ID3 == 1 
           select entities).First(); 

     context.Entities.DeleteOnSubmit(entity); 
     context.SubmitChanges(); 

Voici l'exception:

System.IndexOutOfRangeException was unhandled by user code 
    Message="Index was outside the bounds of the array." 
    Source="System.Data.Linq" 
    StackTrace: 
     at System.Data.Linq.IdentityManager.StandardIdentityManager.MultiKeyManager`3.TryCreateKeyFromValues(Object[] values, MultiKey`2& k) 
     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 Project.Page.Page_Load(Object sender, EventArgs e) in C:\ProjectFolder\Project\Page.aspx.cs:line 31 
     at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) 
     at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) 
     at System.Web.UI.Control.OnLoad(EventArgs e) 
     at System.Web.UI.Control.LoadRecursive() 
     at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    InnerException: 
+0

Y a-t-il un record répondant à vos critères? –

+0

Oui. Il retourne un seul enregistrement. – acermate433s

Répondre

1

J'ai recréé le DBML à partir de zéro. Soupir ...

0

Il semble que LINQ SQL Pour des problèmes (a/a) avec les touches composites. La source réelle est MultiKeyManager et TryCreateKeyFromValues(Object[] values

Ce ElegantCode post on SubmitChanges throws IndexOutOfRangeException a exactement la même erreur que le vôtre, avec des conditions similaires. La différence est qu'il a un autre champ pour modifier le modèle .dbml et marquer comme PK.

Etes-vous capable de modifier/supprimer dans votre modèle .dbml les attributs PrimaryKey=true pour les 3 ints?

La citation clé de cet article:

Retirez les PrimaryKey = true attributs de UnType et SomeValue, et ajouter que sur la propriété viewId, et gère désormais LinqToSql l'association correctement.

+0

J'ai fait ce que tu m'as dit et ça jette toujours la même erreur. Merci. – acermate433s

Questions connexes