Ошибка обновления Entity Framework - PullRequest
3 голосов
/ 11 ноября 2010

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

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

ОБНОВЛЕНИЕ 1: Вот ошибка, которую я получаю при вызове SaveChanges ():

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

ОБНОВЛЕНИЕ 2: Я не использую вставку идентификатора в таблицу БД для этого, так как это импорт из сторонней веб-службы, где мне нужно сохранить все идентификаторы.Я не уверен, повлияет ли это на процесс обновления со структурой сущностей?

ОБНОВЛЕНИЕ 3: Хорошо, хорошо, когда я включаю идентификационную вставку, обновление прошло успешно, однако я не желаю вставлять идентификационные данные в эту таблицу в качестве идентификаторовпередаются из WebService, и мне нужно сохранить эти идентификаторы.

Ответы [ 2 ]

2 голосов
/ 12 ноября 2010

Я не уверен, потому что мне не слишком нравится 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)

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

Обновление

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

См. Этот ответ SO: Обновление значения первичного ключа с использованием структуры сущности

0 голосов
/ 25 августа 2011

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

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

...