2010-11-11 142 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分配相同的值时,上下文会将其解释为完全不同的值,尽管它们是相同的。

我希望这会有所帮助。