违反 PRIMARY KEY 约束。无法插入重复键

Posted

技术标签:

【中文标题】违反 PRIMARY KEY 约束。无法插入重复键【英文标题】:Violation of PRIMARY KEY constraint. Cannot insert duplicate key 【发布时间】:2014-06-30 04:51:47 【问题描述】:

我正在使用List 对象来包含与我的主表具有一对多关系的辅助表中的项目。主表的PK 用作辅助表上的FK 字段。

但是,当记录尝试保存时,我收到此错误

Violation of PRIMARY KEY constraint 'PK_ClearinghousePartners'. Cannot insert duplicate 
key in object 'dbo.ClearinghousePartners'. The duplicate key value is (0)

主表模型

仅供参考 - 此表包含大量字段,因此我只显示 List

public partial class AgentTransmission
 
    .
    .
    public virtual List<ClearinghousePartners> ClearinghousePartners  get; set; 

辅助表模型

public partial class ClearinghousePartners

    public int Id  get; set; 
    public string ClearingHouseName  get; set; 
    public string TradingPartnerName  get; set; 
    public Nullable<System.DateTime> StartDate  get; set; 
    public int AgtTransId  get; set;  //FK field corresponds to 'Id' on AgentTransmission

    public virtual AgentTransmission AgentTransmission  get; set; 

控制器

当模型回传到控制器保存时,这个区域的代码会抛出异常。这是一个实例,其中AgentTransmission 对象是全新的,需要添加到数据库中。 ClearinhousePartners 集合中的每个项目也是如此。

每个都是全新的 ClearinghousePartners 项目,没有 IdAgtTransId 字段的值。我需要先保存AgentTransmission 对象,以便可以创建Id 字段,然后将其插入ClearinghousePartners 对象的AgtTransId 字段中。

agenttransmission.LastChangeDate = DateTime.Now;
agenttransmission.LastChangeOperator = Security.GetUserName(User);
db.AgentTransmission.Add(agenttransmission);
db.SaveChanges(); //Exception thrown here

查看

<fieldset id="ClearinghousePartners">
    <legend>Clearinghouse Partners</legend>
    <center>
        <table>
            <thead>
                <th>Clearinghouse Name</th>
                <th>Trading Partner Name</th>
                <th>Start Date</th>                             
            </thead>
            <tbody>
                @for (int i = 0; i < Model.ClearinghousePartners.Count(); i++)
                
                    <tr align="center">
                        @html.HiddenFor(model => model.ClearinghousePartners[i].Id)
                        @Html.HiddenFor(model => model.ClearinghousePartners[i].AgtTransId)
                        <td>@Html.TextBoxFor(model => model.ClearinghousePartners[i].ClearingHouseName, new  style = "width: 100px" )</td>
                        <td>@Html.TextBoxFor(model => model.ClearinghousePartners[i].TradingPartnerName, new  style = "width: 100px" )</td>
                        <td>@Html.TextBoxFor(model => model.ClearinghousePartners[i].StartDate, new  style = "width: 100px" )</td>                                    
                    </tr>
                
            </tbody>
        </table>                            
    </center>
</fieldset>

【问题讨论】:

【参考方案1】:

重复键值为(0)

我猜您的表没有设置为自动将您的主键值填充为identity 属性。声明应如下所示:

ClearinghousePartners int primary key PK_ClearinghousePartners identity

【讨论】:

【参考方案2】:

您需要为ClearinghousePartners.[PrimaryKey] 指定一个新的未使用值,或者将此列设为自动生成的列(在 sql server 中称为 Identity 列 - 您使用的是什么 RDBMS?)

【讨论】:

以上是关于违反 PRIMARY KEY 约束。无法插入重复键的主要内容,如果未能解决你的问题,请参考以下文章

违反 PRIMARY KEY 约束“[Table_id]”。使用实体框架时无法在对象“[Table_id]”中插入重复键

违反 PRIMARY KEY 约束

(转)sql 违反了 PRIMARY KEY 约束,不能在对象 中插入重复键

使用实体框架添加记录时违反链接记录的PRIMARY KEY约束

如何在不违反主键约束的情况下插入具有循环引用的实体框架

勺子插入 postgres 会产生“重复键值违反唯一约束”