我正在使用实体框架代码优先,下面的逻辑是:如果通过密钥找到消息,那么更新,如果没有找到,则插入,但有时,日志显示未找到,将插入,然后重复的关键异常。
错误日志是:
在latestpumper状态表中未找到相关的pumper信息记录,将插入。详细一般
然后
错误常规
System.Data.Entity.Infrastructure.DbUpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常---> System.Data.UpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常---> System.Data.SqlClient.SqlException:违反PRIMARY KEY约束'PK_dbo.LatestPumperStatus'。无法在对象'dbo.LatestPumperStatus'中插入重复键。重复键值为(EXO_ONPREM,,DM-C3,EWS_Error_Impact_By_Org_V1)。
LatestPumperStatus pumperStatus = dbContext.LatestPumperStatusTable.Where(info =>
string.Compare(info.Datacenter, streamInfo.DataCenter ?? string.Empty, true) == 0
&& string.Compare(info.Datamart, streamInfo.Datamart ?? string.Empty, true) == 0
&& string.Compare(info.Scope, streamInfo.Scope ?? string.Empty, true) == 0
&& string.Compare(info.DatamartTable, streamInfo.DatamartTable ?? string.Empty, true) == 0)
.FirstOrDefault<LatestPumperStatus>();
PumperLogger.LogVerbose("PumperProcessor: Start to try to find related pumper info record in latestpumper status table with this PumperStatusDataStreamInfo:", SerializeToXml<PumperStatusDataStreamInfo>(streamInfo));
if (null == pumperStatus)
{
PumperLogger.LogVerbose("PumperProcessor: Not found related pumper info record in latestpumper status table, will insert into.", SerializeToXml<PumperStatusDataStreamInfo>(streamInfo));
pumperStatus = new LatestPumperStatus();
pumperStatus.SetValue(streamInfo, enqueuedTime, true);
dbContext.LatestPumperStatusTable.Add(pumperStatus);
}
else
{
PumperLogger.LogVerbose("PumperProcessor: Found related pumper info record:", string.Format("{0},{1},{2},{3}", pumperStatus.Scope, pumperStatus.Datamart, pumperStatus.Datacenter, pumperStatus.DatamartTable));
pumperStatus.SetValue(streamInfo, enqueuedTime, false);
}
dbContext.SaveChanges();
LatestPumperStatus'的定义
/// <summary>
/// Pumper Scope
/// </summary>
[Key, Column(Order = 1), StringLength(20)]
public string Scope
{
get
{
return this.scopeValue;
}
set
{
if (value == null)
{
this.scopeValue = string.Empty;
}
else
{
this.scopeValue = value.Substring(0, Math.Min(value.Length, 20));
}
}
}
/// <summary>
/// Pumper Datacenter
/// </summary>
[Key, Column(Order = 2), StringLength(20)]
public string Datacenter
{
get
{
return this.dataCenterValue;
}
set
{
if (null == value)
{
this.dataCenterValue = string.Empty;
}
else
{
this.dataCenterValue = value.Substring(0, Math.Min(value.Length, 20));
}
}
}
/// <summary>
/// Pumper Datamart
/// </summary>
[Key, Column(Order = 3), StringLength(32)]
public string Datamart
{
get
{
return this.datamartValue;
}
set
{
if (null == value)
{
this.datamartValue = string.Empty;
}
else
{
this.datamartValue = value.Substring(0, Math.Min(value.Length, 32));
}
}
}
/// <summary>
/// Pumper Target Table
/// </summary>
[Key, Column(Order = 4), StringLength(128)]
public string DatamartTable
{
get
{
return this.datamartTableValue;
}
set
{
if (null == value)
{
this.datamartTableValue = string.Empty;
}
else
{
this.datamartTableValue = value.Substring(0, Math.Min(value.Length, 128));
}
}
}
答案 0 :(得分:1)
如果两台机器同时运行您的代码,它们都会看到没有行存在,那么它们都会尝试添加相同的行。
要解决此问题,您需要捕获该异常,以便第二台机器可以停止。