2010-10-29 34 views
8

Tôi đang sử dụng Nhibernate (Tôi là một noob hoàn chỉnh), và những gì tôi muốn có thể làm là sao chép một thực thể được tải từ cơ sở dữ liệu và lưu nó với một Id mới. .. có ai chạy vào tình huống này không? Bất kỳ trợ giúp sẽ được rất đánh giá cao.Làm cách nào để sao chép một đối tượng bằng NHibernate

Trả lời

5

tôi cần phải thực hiện chính xác này cho một bộ rất phức tạp của các đối tượng và những gì tôi đã tìm thấy cho đến nay là:

NHibernate không chính xác hỗ trợ này.

Nếu bạn cố gắng chỉ đơn giản là thay thế Id của một đối tượng bạn nhận được từ một phiên, bạn sẽ nhận được một lỗi Nhibernate: định danh của một thể hiện của đã được thay đổi từ < 9ae3868d-17bf-4314-ba0c-4eb3b44b1a2e> để < 2b2b67c6 -a421-48c4-836c-4c27f6481718>

Nếu phiên không còn biết về các đối tượng được truy xuất, nghĩa là nếu bạn gỡ bỏ chúng trước khi lưu và xả, chỉ cần thay đổi id sẽ hoạt động. Vì vậy, bạn có thể viết code như thế này:

public void CloneStudent(Guid studentId) 
    { 
     // Get existing student 
     Student student = _session.Get<Student>(studentId); 

     // Copy by reference 
     Student newStudent = student; 

     // Reset Id to do quick and dirty clone 
     newStudent.Id = Guid.NewGuid(); 
     newStudent.Sticker = "D"; 

     // Must evict existing object or Nhibernate will throw object modified error 
     _session.Evict(student); 

     // Save new object 
     _session.Save(newStudent); 
     _session.Flush(); 


    } 

Vấn đề ở đây là nếu đồ thị đối tượng của bạn có bất kỳ độ sâu bạn phải chắc chắn để đuổi toàn bộ tập, và sau đó bạn có thể cần bản chính trong phiên vẫn bạn phải lấy lại chúng. Đây là một nhức đầu hậu cần và sản lượng mã với ý định rất mơ hồ và phức tạp.

Tôi không khuyến nghị.

Điều thường được thực hiện là tuần tự hóa thành luồng nhị phân và kết hợp lại luồng này thành một nhóm đối tượng mới. Tốt, nhưng chỉ hoạt động nếu các đối tượng của bạn đều có thể tuần tự hóa được.

Đó không phải là trường hợp đối với tôi, những gì tôi đang làm là tôi đã viết mã thủ công để tạo bản sao sâu của một biểu đồ đối tượng bằng cách sử dụng các nhà xây dựng sao chép. Điều này phức tạp và cũng có thể dẫn đến các vấn đề bảo trì, nhưng nếu các đối tượng không thể được tuần tự hóa thì có một vài lựa chọn thay thế tốt hơn.

Rất tiếc, các đối tượng sao chép sâu vẫn là một nhiệm vụ phức tạp nếu việc tuần tự hóa không phải là một tùy chọn.

+0

Cảm ơn bạn đã gợi ý Sisyphus, tôi sợ những gì bạn vừa đề xuất, nhưng may mắn là tôi có sự tiện lợi khi có tất cả các đối tượng thực thể của mình đang được tuần tự hóa. Tôi sẽ thử và cho bạn biết nó hoạt động như thế nào. – PCG

9

Chỉ cần new MyClass() và sao chép mọi thứ ngoại trừ Id. Bạn có thể sử dụng sự phản chiếu cho điều đó.

+1

+1: Đây là những gì chúng tôi làm; bạn có thể sử dụng automapper hoặc valueinjecter để thực hiện việc sao chép là tốt; chỉ cần có nó bỏ qua các id (rõ ràng). – DanP

+0

i giây cho người dùng tự động hóa. đã làm việc cho tôi, với nỗ lực tối thiểu. – fregas

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