2009-07-15 25 views
20

Tôi đang cố đính kèm một thực thể vào ObjectContext. Khi tôi làm như vậy, InvalidOperationException sau được ném:Không thể đính kèm một thực thể tách rời: "Một đối tượng có cùng khóa đã tồn tại trong ObjectStateManager"

An object with the same key already exists in the ObjectStateManager. 
The ObjectStateManager cannot track multiple objects with the same key. 

Tôi đã kiểm tra trong quản lý nhà nước đối tượng và mục không tồn tại:

//Data context is actually the object context. 
ObjectStateEntry contact; 
while (//Should only work once since it should be true if the item was attached 
      !DataContext.ObjectStateManager. 
      TryGetObjectStateEntry(Contact, out contact) 
    ) 
     DataContext.Attach(Contact); //Here is the exception thrown. 

Hoặc nhìn vào ví dụ trừu tượng này và cho tôi biết nếu nó có ý nghĩa:

EntityState state = Contact.EntityState; //Detached 

DataContext.Attach(Contact); //Throws the exception. 
DataContext.AttachTo("Entities.Contacts", Contact); //Throws the Exception 

var detached = DataContext.ObjectStateManager. 
        GetObjectStateEntries(EntityState.Detached); 
//InvalidArgumentException - detached entities cannot be in the obj state mgr 

Câu trả lời trong VB cũng được hoan nghênh.

Trả lời

7

Thực thể Liên hệ của bạn có thể có hai thực thể con có cùng số EntityKey không? Ví dụ, có thể nhận được từ thực thể Liên hệ với hai thực thể Địa chỉ với cùng một khóa không?

Nếu bạn chỉ định MergeOptions.NoTracking ngữ cảnh sẽ vui vẻ trả về biểu đồ đối tượng tách ra có chứa các thực thể có cùng khóa. Tuy nhiên, khi bạn đính kèm cùng một đồ thị đối tượng, System.InvalidOperationException sẽ bị ném.

Tôi khuyên bạn nên xem toàn bộ biểu đồ đối tượng mà bạn đang gắn vào ngữ cảnh và kiểm tra xem có đối tượng có khóa trùng lặp trong đó hay không.

+0

Im phải đối mặt với vấn đề tương tự, bạn có thể cung cấp ví dụ về cách bạn nhìn vào toàn bộ biểu đồ đối tượng mà bạn đang gắn vào ngữ cảnh và kiểm tra xem có đối tượng có khóa trùng lặp trong đó không? – Eduard

4

Tôi đã gặp phải sự cố tương tự trong ứng dụng của mình.

Tôi đã giải quyết vấn đề bằng cách sử dụng ObjectStateManager TryGetObjectStateEntry Method

Trong thực tế, bất động sản EntityState được gây hiểu lầm các nhà phát triển. Mặc dù nó được hiển thị Detached, thú vị gây ra lỗi.

5

Câu trả lời là (và tôi không đề cập đến vấn đề này vì tôi không biết), nếu bạn đặt thuộc tính điều hướng cho thực thể được theo dõi, pháp nhân mới sẽ tự động được thêm:

Dim s = context.States.FirstOrDefault() 
Dim a As New Address 
a.State = s 

Dim state = a.EntityState '= Added 

Vì tôi không biết rằng tôi cứ tự hỏi làm thế nào để thực thể được theo dõi. Tôi sẽ xóa toàn bộ quesion nhưng vì có nỗ lực của câu trả lời khác có thể hữu ích tôi sẽ để nó ở đây, bỏ phiếu để đóng nếu bạn nghĩ rằng nó nên được đóng lại.

+0

Related: http://stackoverflow.com/questions/8759699/entity-framework-creating-new-entity-with-relationship-to-existing-entity-resul – Andre

0

Kiểm tra xem bạn có đang đặt thuộc tính EntityKey của đối tượng Entity hay không. Nếu bạn đang thiết lập nó, hãy chắc chắn rằng bạn không sao chép từ một đối tượng thực thể hiện có.

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