为什么没有找到插入时有重复键

时间:2014-06-09 12:43:40

标签: c# .net entity-framework-5

我正在使用实体框架代码优先,下面的逻辑是:如果通过密钥找到消息,那么更新,如果没有找到,则插入,但有时,日志显示未找到,将插入,然后重复的关键异常。

错误日志是:

  

在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));
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

如果两台机器同时运行您的代码,它们都会看到没有行存在,那么它们都会尝试添加相同的行。

要解决此问题,您需要捕获该异常,以便第二台机器可以停止。