我有这个奇怪的错误Cannot add an entity with a key that is already in use
但是那个错误是非常烦躁的是用户没有被拒绝 - 谁?什么?什么表?什么记录是这个错误的罪魁祸首?
如果你之前在LINQ对象上做了很多操作,那么确定它会非常复杂 .Submit()
有什么方法可以确定导致此错误的原因是什么?
Nei*_* T. 10
当您在具有外键关系的MetaTable中创建新记录并且外键记录已存在时,通常会发生此错误.
例如,假设您有一个Contact表和一个Address表,每个Contact可以包含多个Addresses.创建新的联系人记录并尝试手动将现有地址记录与该新联系人关联时,会发生此错误.
假设传递的地址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();
}
Run Code Online (Sandbox Code Playgroud)
从历史上看,SQL开发人员经过培训只需传递ID值即可实现魔术.使用LINQ-to-SQL,因为数据库活动是抽象的,所以我们必须传递整个对象,以便LINQ引擎能够正确地反映ChangeSet中的必要更改.在上面的示例中,LINQ引擎假定您要求创建一个新的Address记录,因为在创建SubmitChanges时它没有一个可以使用它,并且它必须遵守由外键关系建立的合同.它使用传递的ID值创建一个空白的地址记录.发生此错误是因为该ID值已存在于数据表中,并且ChangeSet未将地址增量标记为更新.
修复是传入整个记录,而不仅仅是ID值:
contact.ContactAddress = DataContext.Addresses.Where(a => a.Address_ID == addressID).Single();
Run Code Online (Sandbox Code Playgroud)
现在,LINQ引擎可以正确地将传入的地址记录标记为现有记录,而不是尝试重新创建它.
听起来您正在执行 Table.Attach() 并且您要附加的实体具有 L2S 已在跟踪的键值。这与物理数据库中的重复键无关。