繁体   English   中英

实体框架更新错误

[英]Entity Framework Update error

我通过以下代码获得了主键错误的消息。 我无法看到为什么会这样,我需要解决它。 有人可以用一双新眼睛帮忙吗?

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:好的,当我打开身份插入更新成功但是我不希望在此表上插入ID,因为Ids是从WebService传入的,我需要保留这些ID。

我不确定,因为我对实体框架不太热,但你需要这条线吗?

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)

我认为它是多余的,也可能导致主键错误,因为我认为你不能在创建主键后分配它。

更新

快速搜索了,一旦创建了主键就无法更新主键,所以我很确定这是你的错误所在。

请参阅此答案: 使用实体框架更新主键值

我相信您的问题在于更新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分配了相同的值时,上下文将把它解释为完全不同的值,即使它是相同的。

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM