2010-11-11 104 views
3

我收到以下代碼的主鍵錯誤聲明。我不明白爲什麼這可能是,我需要整理出來。任何人都可以用一雙新鮮的眼睛幫忙嗎?實體框架更新錯誤

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:我不使用的數據庫表標識插入這個,因爲這是從第三方Web服務導入的,我需要保留所有Id。我不確定這是否會影響實體框架的更新過程?

更新3:好吧,當我打開身份插入更新成功,但是我不希望在該表上插入indentity,因爲Ids是從WebService傳入的,我需要保留這些ID。

+0

哪一行是錯誤?錯誤信息中是否有任何可能有用的信息? – 2010-11-11 21:16:20

+1

你忘了將PK屬性標記爲「自動生成」並不是那麼簡單? – Ozzy 2010-11-11 21:33:18

+0

在這種情況下PK不是自動生成的,也許這是我的問題?這基本上是從已經指定了ID的第三方Web服務運行導入? – Kevin 2010-11-11 22:29:40

回答

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 primary key value using entity framework

+0

感謝您的這一點,我已經採取了這一點,但仍然得到相同的錯誤。它似乎仍然試圖插入重複的記錄。我感到困惑。 – Kevin 2010-11-11 22:10:47

0

我相信你的問題,當你正在更新Event_ID物業所在。您通過match DBContext從數據庫請求的對象已經包含與Web服務相同的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分配相同的值時,上下文會將其解釋爲完全不同的值,儘管它們是相同的。

我希望這會有所幫助。