2010-10-29 29 views

cevap

5

Ben çok karmaşık nesneler kümesine ve ne şimdiye kadar bulduk olduğu için tam olarak bunu yapmak gerekir. sadece bir oturumdan var bir nesnenin kimliği değiştirmeye çalışırsanız

, bir Nhibernate hata mesajı görüntülenir:> < 9ae3868d-17bf-4314-ba0c-4eb3b44b1a2e gelen değiştirilmiş bir örneğinin tanımlayıcı < 2b2b67c6 için -a421-48c4-836c-4c27f6481718>

sadece kimlikleri şimdi çalışacaktır değişen, kaydetme ve sifonu önce onları tahliye eğer oturumu artık alınan nesneler, yani yaklaşık biliyorsa. Yani bunun gibi bir kod yazabilirsiniz:

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(); 


    } 

bu sorun senin nesne grafiği tamamını setini tahliye emin olmak için ve sonra size hala oturumda orijinalleri gerekebilir sahip herhangi derinliğe sahip olmadığını Onları tekrar almak zorunda. Bu lojistik bir baş ağrısıdır ve çok belirsiz ve kıvrımlı niyetlerle kod üretir.

Tavsiye etmiyorum. Daha çok yapılan şey, bir ikili akışa serileştirilmesi ve bu akışı yeni bir nesne kümesine yeniden yapılandırmasıdır. Tamam, ama sadece nesneleriniz seri hale getirilebilirse çalışır.

Bu benim için durum böyle değil, yaptığım şey kopya oluşturucuları kullanarak bir nesne grafiğinin derin kopyalarını yapmak için manuel kod yazdım. Bu karmaşıktır ve aynı zamanda bakım sorunlarına da yol açabilir, ancak eğer nesneler serileştirilemiyorsa, daha az alternatif vardır.

Seri hale getirme bir seçenek değilse, derin kopyalama nesneleri karmaşık bir görev kalır.

+0

Önerileriniz için teşekkürler Sisyphus, önerdiğin şeyden korkuyordum ama neyse ki bütün nesnelerimin seri hale getirilebilme rahatlığına sahibim. Bir deneyeceğim ve nasıl çalıştığını anlatayım. – PCG

9

Sadece new MyClass() yapın ve Kimlik dışındaki her şeyi kopyalayın. Bunun için yansımayı kullanabilirsiniz.

+1

+1: Yaptığımız şey bu; kopyasını gerçekleştirmek için automapper veya valueinjecter kullanabilirsiniz; sadece kimliği görmezden gitsin (belli ki). Kullanıcı automapper için – DanP

+0

i. Benim için çok az çaba sarf etti. – fregas