2010-01-11 27 views
8

Tôi đã gặp lỗi lạ này Cannot add an entity with a key that is already in use Nhưng điều khá khó chịu về lỗi đó là người dùng không bị chặn - Ai? Gì? Bảng gì? Hồ sơ nào là thủ phạm của lỗi này?không thể thêm một thực thể có khóa đã được sử dụng

Nó sẽ được tuyệt vọng phức tạp để xác định nó, trong trường hợp bạn làm nhiều hoạt động trên các đối tượng LINQ trước .Submit()

Có cách nào để xác định những gì chắc chắn gây ra lỗi này?

Trả lời

0

Có vẻ như bạn đang thực hiện một Table.Attach() và thực thể bạn đang gắn có một giá trị khóa mà L2S đã theo dõi. Điều này không có gì để làm với một khóa trùng lặp trong cơ sở dữ liệu vật lý của bạn.

+2

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

10

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ó.

1

Có thể cột bạn cố gắng để Attach(), Remove(), Add() hoặc DeleteOnSubmit(), là một khóa chính và bạn đang cố gắng để thêm hoặc đính kèm cùng giá trị một lần nữa.

Ngoài ra bạn có thể đang truy cập khóa chính hoặc cột giá trị khóa ngoài bằng một phương thức khác và chưa đóng khi bạn cố gọi các phương thức trên.

Trên những phương pháp Attach(), Remove(), Add() hoặc DeleteOnSubmit(), cố gắng tạo ra một thể hiện mới của DataContext của bạn một lần nữa và chạy.

0

Như được giải thích trên một trong các câu trả lời ở trên, lỗi này có nhiều khả năng là do cố chèn bản ghi vào bảng với giá trị lặp lại trên trường khóa ID chính. Bạn có thể giải quyết vấn đề bằng cách chọn/tạo khóa chính khác.

Các vấn đề liên quan