Linq to sql 无法添加已存在的标识

Linq to sql 无法添加已存在的标识,linq-to-sql,Linq To Sql,我正在一个简单的费用记录应用程序中使用C#4.0。我试图保存到一个具有自动递增id字段的表中,该字段设置为主键。在我第一次使用它时,它可以正常工作,但在第二次和随后的一次,我得到了“无法添加已经存在的标识”错误 这是我遇到麻烦的代码 public bool SaveClaim(Claim newClaim, bool blNew) { bool blSuccess = true; try { expContext.Claims.InsertOnSubmit

我正在一个简单的费用记录应用程序中使用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;
}
我整个上午都在做这件事,快把我逼疯了。我很乐意为您提供帮助。

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

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

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

下面是一个有用的线程:


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

自动生成的值=真

自动同步=OnInsert


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

也许您应该尝试更新设计器。 删除表声明,更新服务器资源管理器,然后再次添加


至少当我遇到这个错误时我就是这么做的。编译后在数据库上设置identity列时通常会显示此信息。

我已尝试修复损坏的代码,但仍然不完整。正在使用的
blNew
在哪里?什么是
claim=null
?请尝试运行SQL查询探查器,以找出正在执行的内容,并验证id是否确实在递增且未传入。第二次调用它时,这确实是一个新的声明还是更改了现有的声明实体?后者不起作用。在linq2sql上没有UpdateOnSubmit这样的东西。您只需更改实体并进行submitchanges.True。所以,通过更多的研究,我调整了我的答案。非常感谢各位,你们的帮助是无价的。我是linqtoSQL的新手,可以看出我还有很多东西要学。顺便说一句,我在重复使用索赔实体,这就是造成问题的原因。
if (blNew)
{
        expContext.Claims.InsertOnSubmit(newClaim);
}