Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql 无法添加具有已在使用的密钥的实体_Linq To Sql - Fatal编程技术网

Linq to sql 无法添加具有已在使用的密钥的实体

Linq to sql 无法添加具有已在使用的密钥的实体,linq-to-sql,Linq To Sql,我遇到了一个奇怪的错误无法添加具有已在使用的密钥的实体 但这个错误让人非常恼火的是,用户得不到详细信息——谁?什么?什么桌子?这一错误的罪魁祸首是什么 如果您在.Submit()之前对LINQ对象执行许多操作,那么确定它将非常复杂 有没有办法确定是什么导致了这个错误?听起来你在做一个Table.Attach(),并且你正在附加的实体有一个L2S已经在跟踪的键值。这与物理数据库中的重复键无关。当您在具有外键关系的元表中创建新记录,并且外键记录已存在时,通常会发生此错误 例如,假设您有一个联系人表和

我遇到了一个奇怪的错误
无法添加具有已在使用的密钥的实体
但这个错误让人非常恼火的是,用户得不到详细信息——谁?什么?什么桌子?这一错误的罪魁祸首是什么

如果您在
.Submit()之前对LINQ对象执行许多操作,那么确定它将非常复杂


有没有办法确定是什么导致了这个错误?

听起来你在做一个Table.Attach(),并且你正在附加的实体有一个L2S已经在跟踪的键值。这与物理数据库中的重复键无关。

当您在具有外键关系的元表中创建新记录,并且外键记录已存在时,通常会发生此错误

例如,假设您有一个联系人表和一个地址表,每个联系人可以拥有多个地址。创建新联系人记录并尝试手动将现有地址记录与该新联系人关联时,会发生此错误

假设传递的地址ID表示现有地址记录,则此操作无效:

public class Contact
{
    public int Contact_ID { get; set; }
    public string Name { get; set; }
    public Address ContactAddress { get; set; }
    public string Phone { get; set; }
}

public class Address
{
    public int Address_ID { get; set; }
    public string Street { get; set; }
    public string CityState { get; set; }
    public string ZIP { get; set; }
}

public void CreateNewContact(int addressID)
{
    Contact contact = new Contact();

    contact.Name = "Joe Blough";
    contact.ContactAddress.Address_ID = addressID;
    contact.Phone = "(555) 123-4567";

    DataContact.SubmitChanges();
}
从历史上看,SQL开发人员被训练为只传递ID值,以实现神奇的效果。使用LINQ to SQL,因为数据库活动是抽象的,所以我们必须传递整个对象,以便LINQ引擎能够正确地反映变更集中的必要更改。在上面的示例中,LINQ引擎假设您正在请求创建一个新的地址记录,因为在进行提交更改时,它没有地址记录可以使用,并且它必须遵守外键关系所建立的契约。它使用传递的ID值创建一个空白地址记录。发生此错误是因为数据表中已存在该ID值,并且变更集未将地址增量标记为更新

修复方法是传入整个记录,而不仅仅是ID值:

contact.ContactAddress = DataContext.Addresses.Where(a => a.Address_ID == addressID).Single();

现在,LINQ引擎可以正确地将传入的地址记录标记为现有地址记录,而不尝试重新创建它。

可能是您尝试附加()的列,
删除()
添加()
删除提交()
,是主键,并且您正在尝试再次添加或附加相同的值

另外,您可能正在另一个方法中访问主键或外键值列,并且在尝试调用上述方法时,该列尚未关闭


在上述方法中,
Attach()
Remove()
Add()
DeleteOnSubmit()
,请尝试再次创建datacontext的新实例并运行。

如上述答案之一所述,此错误更可能是由于尝试在主ID键字段中插入重复值的记录到表中。您可以通过选择/创建不同的主键来解决此问题。

不要对表进行粗略操作(附加、分离或其他)。但仍然不清楚为什么会抛出这个异常,如果我有更多关于异常的详细信息,我将能够找到必须修改的代码