2010-11-11 6 views
3

Je reçois un message d'erreur de clé primaire avec le code suivant. Je ne peux pas voir pour voir pourquoi cela peut être et je dois le trier. Quelqu'un peut-il aider avec une nouvelle paire d'yeux?Entity Framework Erreur de mise à jour

var events = (from e in nodes.Descendants("event") 
           select new Event 
           { 
            Event_ID = int.Parse(e.Attribute("event_id").Value), 
            Name = e.Attribute("name").Value, 
            Code = e.Attribute("code").Value, 
            Minute = e.Attribute("minute").Value != String.Empty ? int.Parse(e.Attribute("minute").Value) : 0, 
            Minute_Extra = e.Attribute("minute_extra").Value != String.Empty ? int.Parse(e.Attribute("minute_extra").Value) : 0, 
            Team = GetTeam(e.Attribute("team_id")), 
            Last_Updated = DateTime.Parse((FormatDateTime(e.Attribute("last_updated").Value))) 

           }); 

foreach (Event matchEvent in events) 
{ 

    //Check to see if this event exists 
    if (match.Events.Any(o => o.Event_ID == matchEvent.Event_ID)) 
    { 
     Event theEvent = (from m in match.Events 
          where m.Event_ID == matchEvent.Event_ID 
          select m).FirstOrDefault(); 

     //There is an event with this ID, so check its last updated flag 
     if (theEvent.Last_Updated < matchEvent.Last_Updated) 
     { 
      //Update the current event 
      theEvent.Event_ID = matchEvent.Event_ID; 
      theEvent.Name = matchEvent.Name; 
      theEvent.Code = matchEvent.Code; 
      theEvent.Minute = matchEvent.Minute; 
      theEvent.Minute_Extra = matchEvent.Minute_Extra; 
      theEvent.Team = matchEvent.Team; 
      theEvent.Last_Updated = matchEvent.Last_Updated; 
     } 

    } 
    //If the event is not there we need to add it 
    else 
    { 
     match.Events.Add(matchEvent); 
    } 

    myDb.SaveChanges(); 

MISE À JOUR 1: Ce qui suit est l'erreur que je reçois quand SaveChanges() est appelée:

{"Violation of PRIMARY KEY constraint 'PK_Matches_1'. Cannot insert duplicate key in object 'dbo.Matches'.\r\nThe statement has been terminated."}

MISE À JOUR 2: Je n'utilise pas l'insertion d'identité sur la table DB pour ce que cela est une importation provenant d'un service Web tiers dans lequel je dois conserver tous les identifiants. Je ne suis pas sûr si cela affectera le processus de mise à jour avec cadre d'entité? MISE À JOUR 3: Ok, quand j'active l'insertion d'identité, la mise à jour est réussie, mais je ne souhaite pas d'insertion d'indentité sur cette table car les ID sont transmis à partir d'un WebService et je dois conserver ces IDs.

+0

Sur quelle ligne est l'erreur? Est-ce que l'erreur contient quelque chose dans le message qui pourrait être utile? –

+1

Ce n'est pas si simple que vous avez oublié de marquer la propriété PK comme 'Auto Generated'? – Ozzy

+0

Le PK n'est pas généré automatiquement dans ce cas, c'est peut-être mon problème? Cela consiste essentiellement à effectuer une importation à partir d'un service Web tiers où les ID sont déjà spécifiés? – Kevin

Répondre

2

Je ne suis pas sûr, parce que je ne suis pas trop chaud sur Entity Framework, mais avez-vous besoin de cette ligne?

theEvent.Event_ID = matchEvent.Event_ID; 

Il vient juste après

//There is an event with this ID, so check its last updated flag 
if (theEvent.Last_Updated < matchEvent.Last_Updated) 

et je pense qu'il est redondant et pourrait également provoquer une erreur de clé primaire, car je ne pense pas que vous pouvez attribuer à une clé primaire une fois qu'il a été créé.

Mise à jour

fait une recherche rapide, et vous ne pouvez pas mettre à jour une clé primaire une fois qu'il a été créé, donc je suis sûr que c'est là votre erreur.

Voir cette réponse SO: Update primary key value using entity framework

+0

Merci pour cela, je l'ai pris mais encore obtenir la même erreur. Il semble toujours essayer d'insérer un enregistrement en double. Je suis perplexe. – Kevin

0

Je crois que votre problème est lorsque vous mettez à jour la propriété Event_ID. L'objet que vous avez demandé à votre base de données via le DBContext match contient déjà le même Event_ID que le service Web. Par conséquent, il n'est pas nécessaire de mettre à jour cette valeur

if (theEvent.Last_Updated < matchEvent.Last_Updated) 
{ 
    //Update the current event 
    theEvent.Event_ID = matchEvent.Event_ID; // <-- Delete this line. 
    ... 
} 

Vous pouvez demander, pourquoi est-ce important car les deux valeurs sont les mêmes? Comme il arrive, le DBContext garde la trace de vos objets et de ses changements. Dans le contexte même, chaque propriété a une valeur originale et actuelle. Lorsque vous attribuez la même valeur au Event_ID, le contexte va l'interpréter comme une valeur complètement différente, même si elle est la même.

J'espère que cela aide.

Questions connexes