linq2sql:无法使用已在使用的密钥添加实体

Nie*_*sma 17 c# linq-to-sql

我有一个linq2sql设置,其中对象从客户端发送(通过flourinefx flex)并将它们附加到新的datacontext,如下所示:

我还有一个在整个会话中使用的"全局"datacontext.

    public static void Update(Enquiry enquiry)
    {
        OffertaDataContext db = new OffertaDataContext();


        db.Enquiries.Attach(enquiry);
        db.Refresh(RefreshMode.KeepCurrentValues, enquiry);

        db.SubmitChanges();
    }
Run Code Online (Sandbox Code Playgroud)

这种方法通常工作正常,但过了一段时间我得到错误"无法添加一个已经在使用的密钥的实体".

vea*_*ler 42

我收到此错误是因为我忘记将数据库中的主键字段设置为"身份规范"(自动增量).当我改变这个时,我很好.卫生署!


bru*_*nde 9

我认为如果你已经加载了Attach一个实体,就会发生这个错误DataContext.

导致错误的代码与您在此处显示的完全相同?创建新的后OffertaDataContext你在查询之前的任何内容Attach吗?

  • 是的,我愿意.我从数据库中获取了旧记录以检查新的一些属性,并且我使用了相同的DataContext.我解决了两个sepparate使用条款. (2认同)

mat*_*mc3 5

这可能不是你的问题(我不知道),但这是我的问题,当人们用谷歌搜索时,它可能会帮助其他人。如果您没有使用内置的 Linq-to-SQL 设计器或 SQLMetal 的东西来生成您的 Linq-to-SQL 类,或者如果您忘记将 ID 列设为 IDENTITY,则您可能缺少列上的属性名为“IsDbGenerated”的属性。确保您的列属性如下所示:

<Column(Name:="ID", DbType:="Int NOT NULL IDENTITY", CanBeNull:=False, IsPrimaryKey:=True, IsDbGenerated:=True)>
Run Code Online (Sandbox Code Playgroud)


Jul*_*bre 5

如果您一次插入多个实体,可能只是想在当前数据上下文中插入重复的实体。我知道这太简单了,但这只是发生在我自己身上。