Lỗi này thường xảy ra khi bạn tạo bản ghi mới trong MetaTable với mối quan hệ khóa ngoại và bản ghi khóa ngoài đã tồn tại.
Ví dụ: giả sử bạn có bảng Liên hệ và bảng Địa chỉ và mỗi Liên hệ có thể chứa nhiều Địa chỉ. Lỗi xảy ra khi bạn tạo một bản ghi Liên hệ mới và cố gắng liên kết thủ công một bản ghi Địa chỉ hiện có với Liên hệ mới đó.
Giả sử địa chỉ ID thông qua đại diện cho một kỷ lục Địa chỉ hiện tại, điều này không làm việc:
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();
}
Về mặt lịch sử, các nhà phát triển SQL được đào tạo để chỉ cần vượt qua giá trị ID để cho sự kỳ diệu xảy ra. Với LINQ-to-SQL, bởi vì hoạt động cơ sở dữ liệu được trừu tượng hóa, chúng ta phải truyền toàn bộ đối tượng sao cho công cụ LINQ có thể phản ánh đúng các thay đổi cần thiết trong ChangeSet. Trong ví dụ trên, công cụ LINQ giả định rằng bạn đang yêu cầu tạo một bản ghi Địa chỉ mới, bởi vì nó không có một để làm việc với khi SubmitChanges đã được thực hiện và nó phải tôn trọng hợp đồng được thiết lập bởi mối quan hệ khóa ngoài. Nó tạo ra một bản ghi địa chỉ trống với giá trị ID đã truyền. Lỗi xảy ra vì giá trị ID đó đã tồn tại trong bảng dữ liệu và ChangeSet đã không gắn cờ Địa chỉ delta làm Cập nhật.
Việc sửa chữa là phải vượt qua trong toàn bộ hồ sơ, không chỉ là giá trị ID:
contact.ContactAddress = DataContext.Addresses.Where(a => a.Address_ID == addressID).Single();
Bây giờ, động cơ LINQ đúng cách có thể cờ kỷ lục Địa chỉ đến như một trong hiện tại và không cố gắng để tái tạo nó.
Nguồn
2010-01-11 22:42:48
Không có hành động thô lỗ với các bảng (đính kèm, tách bất kỳ thứ gì). Nhưng vẫn còn mơ hồ tại sao ngoại lệ này bị ném Nếu tôi có thông tin chi tiết hơn về ngoại lệ, tôi có thể tìm ra mã nào phải được sửa đổi – igor