我通过以下代码获得了主键错误的消息。我无法看到为什么会这样,我需要解决它。有人可以用一双新眼睛帮忙吗?
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。
答案 0 :(得分:2)
我不确定,因为我对实体框架不太热,但你需要这条线吗?
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)
我认为它是多余的,也可能导致主键错误,因为我认为一旦创建主键就不能将其分配给主键。
<强>更新强>
进行了快速搜索,并且在创建主键后无法更新主键,因此我很确定这是您的错误所在。
答案 1 :(得分: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
分配相同的值时,上下文将把它解释为完全不同的值,即使它是相同的。
我希望这会有所帮助。