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键字段中插入重复值的记录到表中。您可以通过选择/创建不同的主键来解决此问题。不要对表进行粗略操作(附加、分离或其他)。但仍然不清楚为什么会抛出这个异常,如果我有更多关于异常的详细信息,我将能够找到必须修改的代码