linq-to-sql – 无法使用已在使用的密钥添加实体

前端之家收集整理的这篇文章主要介绍了linq-to-sql – 无法使用已在使用的密钥添加实体前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这个奇怪的错误无法添加一个已经在使用的密钥的实体
但对于这个错误而言,非常烦躁的是,用户没有被剥夺 – 谁?什么?什么表?什么记录是这个错误的罪魁祸首?

如果你在LINQ对象之前做了很多操作,那么确定它会非常复杂.Submit()

有什么方法可以确定导致此错误的原因是什么?

解决方法

当您在具有外键关系的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();
}

从历史上看,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();

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

猜你在找的MsSQL相关文章