2012-07-22 23 views
5

Tôi đã thử các sau đây để tách một đồ thị của các đối tượng tổ chức nào, và sau đó gắn nó vào một bối cảnh mới:Biểu đồ có thể tách rời khỏi ObjectContext và được gắn lại với một đối tượng khác không?

// create a context 
var ctx = new TestEntities(); 
var parents = ctx.Parents; 

// populate the graph 
var newParent = new Parent {Nb = 1, Title = "Parent1"}; 
parents.AddObject(newParent); 
newParent.Children.Add(new Child {Nb = 1, Title = "Child1"}); 

// put all entity objects in Unchanged state before detaching 
ctx.SaveChanges(); 

// detach all entity objects 
foreach (var objectStateEntry in ctx.ObjectStateManager.GetObjectStateEntries(~EntityState.Detached)) 
    ctx.Detach(objectStateEntry.Entity); 

// create a new context 
ctx = new TestEntities(); 

// attach graphs to new context 
foreach (var p in parents) 
    ctx.Attach(p); 

Tôi có hai vấn đề với cách tiếp cận này:

  1. Sau khi tách tất cả các đối tượng tổ chức nào, newParent.Children trở thành trống
  2. Một InvalidOperationException được nâng lên khi gắn lại nói rằng "Một đối tượng thực thể không thể được tham chiếu bởi nhiều phiên bản của IEntityChangeTracker".

Có ai biết cách tách biểu đồ một cách chính xác khỏi ObjectContext không và đính kèm lại đồ thị đó với một đối tượng khác?

UPDATE:

Ok tin tốt lành đối với tôi, tôi đã tìm ra cách thay đổi các kết nối cơ sở dữ liệu cơ bản trong cùng một ObjectContext, vì vậy tôi không cần phải tách/đính kèm nữa. Nếu ai quan tâm, dưới đây là cách tôi làm điều đó (ở đây tôi sử dụng SQLite và thay đổi các tập tin cơ sở dữ liệu):

var sc = ((EntityConnection)ctx.Connection).StoreConnection; 
sc.ConnectionString = @"Data Source=" + newFile + ";"; 

Tôi sẽ chấp nhận câu trả lời Ladislav như nó có vẻ là đúng và trả lời câu hỏi của tôi như nó đã được hỏi.

Trả lời

3

Bạn phải tạo bản sao sâu của toàn bộ biểu đồ và đính kèm nó vào ngữ cảnh khác. Bản sao sâu được tạo ra thông qua việc tuần tự hóa. Phương pháp phổ biến là sử dụng DataContractSerializer:

var serializer = new DataContractSerializer(typeof(Parent)); 
serializer.WriteObject(stream, attachedEntity); 
stream.Seek(0, SeekOrgin.Begin); 
detachedEntity = (Parent)serializer.ReadObject(stream); 

Để làm điều này làm việc các đơn vị của bạn không được chứa tham chiếu vòng tròn (mẹ có tài sản chuyển hướng để trẻ em và trẻ em có tài sản chuyển hướng để mẹ) hoặc bạn phải sử dụng DataContract(IsReference=true)DataMember thuộc tính trên các thực thể của bạn để thông báo cho bộ nối tiếp rằng nó phải theo dõi các tham chiếu để giải quyết vấn đề tham chiếu vòng tròn.

+0

Tôi không muốn sao chép vì tôi có ngăn xếp hoàn tác/làm lại đề cập đến các đối tượng trong biểu đồ và tôi không muốn xóa chồng khi tôi thay đổi ObjectContext. Bạn có biết về bất kỳ cách tiếp cận nào khác mà tôi có thể sử dụng để thay đổi bối cảnh, hoặc chỉ đối tượng kết nối của nó, trong khi tiếp tục sử dụng cùng một đồ thị? –

+1

Trong trường hợp này, bạn phải sử dụng cùng ngữ cảnh cho cả hai thao tác vì hiện tại không có cách nào để tách thực thể và giữ quan hệ của nó - đó là lý do tại sao bạn phải sao chép để giữ chúng. –

+0

Có, tôi sợ điều đó, nhưng hey, tôi chỉ phát hiện ra tôi có thể thay đổi chuỗi kết nối cơ bản, và vì vậy tôi không cần phải tách/đính kèm để bắt đầu. –

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