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