2010-11-11 2 views
3

Я получаю сообщение об ошибке первичного ключа со следующим кодом. Я не могу понять, почему это может быть, и мне нужно разобраться. Может ли кто-нибудь помочь с новыми парами глаз?Ошибка обновления Entity Framework

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(); 

UPDATE 1: Ниже ошибка я получаю, когда SaveChanges() называется:

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

UPDATE 2: Я не использую вставку идентичности на столе DB для этого, так как это это импорт из сторонней веб-службы, где мне нужно сохранить все идентификаторы. Я не уверен, повлияет ли это на процесс обновления с помощью инфраструктуры сущностей?

UPDATE 3: Хорошо, когда я включаю идентификационную вставку, обновление успешно, однако я не хочу иметь вставку indentity в этой таблице, поскольку идентификаторы передаются из WebService, и мне нужно сохранить эти идентификаторы.

+0

Какая строка является ошибкой? Имеет ли ошибка сообщение в сообщении, которое может быть полезным? –

+1

Не так просто, что вы забыли отметить PK-свойство как «Auto Generated»? – Ozzy

+0

PK в этом случае не генерируется автоматически, может быть, это моя проблема? Это в основном выполняется импорт из веб-службы третьей стороны, где идентификаторы уже указаны? – Kevin

ответ

2

Я не уверен, потому что я не слишком горячий на Entity Framework, но вам нужна эта строка?

theEvent.Event_ID = matchEvent.Event_ID; 

Он приходит только после

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

и я думаю, что это излишним, а также может вызвать первичный ключ ошибки, так как я не думаю, что вы можете назначить на первичный ключ, как только это было создано.

Update

ли быстрый поиск, и вы не можете обновить первичный ключ, как только он был создан, так что я уверен, что это, где ваша ошибка.

Посмотрите этот SO ответ: Update primary key value using entity framework

+0

Спасибо за это, я взял это, но STILL получил ту же ошибку. Кажется, что все еще пытается вставить дубликат записи. Я смущен. – Kevin

0

Я считаю, что ваша проблема заключается, когда вы обновляете Event_ID собственности. Объект, запрошенный у вашей базы данных через DBContext match, уже содержит тот же Event_ID, что и веб-сервис. Поэтому нет необходимости обновлять это значение

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

Вы можете спросить, почему это имеет значение, поскольку оба значения одинаковы? Так как это происходит, DBContext отслеживает ваши объекты и их изменения. В самом контексте каждое свойство имеет исходное и текущее значение. Когда вы назначили то же значение в Event_ID, контекст будет интерпретировать его как совершенно другое значение, даже если оно то же самое.

Надеюсь, это поможет.

Смежные вопросы