【问题标题】:Cannot add an identity that already exists无法添加已存在的身份
【发布时间】:2011-08-24 04:07:48
【问题描述】:

我在一个简单的费用记录应用程序中使用 C#4.0。我正在尝试使用自动递增的 id 字段保存到表中,设置为主键。我第一次使用它时效果很好,但第二次和以后的时候,我得到“无法添加已经存在的身份”错误。

这是我遇到问题的代码

public bool SaveClaim(Claim newClaim, bool blNew)
{
    bool blSuccess = true;
    try
    {
        expContext.Claims.InsertOnSubmit(newClaim);
        expContext.SubmitChanges();
        claim = null;
    }
    catch (Exception e)
    {
        blSuccess = false;
        MessageBox.Show(e.ToString());
    }
    return blSuccess;
}

我整个上午都在处理这个问题,这让我发疯了。我很乐意为您提供任何帮助。

【问题讨论】:

  • 我已尝试修复您损坏的代码,但仍不完整。 blNew 在哪里使用? claim = null 是干什么用的?
  • 尝试运行 SQL Query Profiler 以找出正在执行的内容,并验证 id 实际上是在递增而不是传入。
  • 您第二次调用它,这真的是一个新的声明还是您更改了现有的声明实体?后者是行不通的。

标签: linq-to-sql


【解决方案1】:

确保您在 dbml 中为 Claim 的标识列设置了以下属性:

自动生成值 = true

自动同步 = OnInsert

还要确保您的新 Claim 对象实际上是一个新对象,而不是重复使用您之前添加的对象。

【讨论】:

    【解决方案2】:

    也许您应该尝试更新您的设计师。 删除表 Claim,更新服务器资源管理器,然后重新添加。

    至少当我收到此错误时我就是这样做的。一般是在我编译后在数据库上设置标识列时显示的。

    【讨论】:

      【解决方案3】:

      也许您正在尝试使用 INSERT 方法更新 newClaim。

      如果 newClaim 有 ID 并且方法 expContext.Claims.InsertOnSubmit(newClaim) 正在尝试插入具有该 ID 的记录。这可能是问题所在。

      if (blNew)
          expContext.Claims.InsertOnSubmit(newClaim);
      else
          expContext.Claims.UpdateOnSubmit(newClaim); //-- Assumed method
      

      附加

      这是一个有用的线程:MSDN Forums

      if (blNew)
      {
              expContext.Claims.InsertOnSubmit(newClaim);
      }
      

      【讨论】:

      • linq2sql 上没有 UpdateOnSubmit 这样的东西。您只需更改实体并提交更改即可。
      • 是的。因此,通过更多研究,我调整了我的答案。
      • 非常感谢伙计们,您的帮助非常宝贵。我是 linqtoSQL 的新手,我可以看到我有很多东西要学。顺便说一句,我正在重新使用声明实体,这就是造成问题的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2023-01-09
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      相关资源
      最近更新 更多