Bir NHibernate projesi üzerinde çalışıyorum ve geçici varlıkların güncellenmesiyle ilgili bir sorum var. aşağıdaki gibiNHibernate - belirli özellikleri 'kirli' olarak işaretleme
Temelde iş akışı:
- bir DTO (projeksiyon) oluşturun ve müşteriye teli yolla. Bu, varlıktan küçük bir özellik kümesine sahiptir.
- Müşteri değiştirilen DTO'yu geri gönderir
- DTO özelliklerini uygun enititeye eşleştirin, böylece UPDATE ifadesi NH tarafından oluşturulabilir ve yürütülebilir. Sorunu sahip olduğu
- kaydet varlık
Nokta 4'tür. Şu anda bu güncellemeyi session.Merge() yöntemini kullanarak elde edebilirim, ancak önce güncellemeden önce varlığı db'den (2LC almayın) yüklemelisiniz. Yani, hem bir seçim hem de güncelleme bildirisi tetiklendi.
Yapmak istediğim şey, varlığın geçici bir örneğini oluşturmak, yeni değerleri DTO'dan eşlemek, ardından NH'nin yalnızca değiştirdiğim özellikleri kullanarak bir SQL deyimi oluşturmasıdır. Varlık kimliğinin ve SET cümlesi için gereken değerlerin zaten olması nedeniyle ek seçimin gereksiz olması gerekir. Bu NH'de mümkün mü?
Şu anda session.Update() işlevini kullanarak, tüm özellikler güncelleştirme ifadesine dahil edilecek ve DTO'nun parçası olmayan başlatılmamış özellikler nedeniyle bir istisna kaldırılacaktır.
Esas olarak, hangi varlık özelliklerinin kirli olduğunu belirtmenin bir yoluna ihtiyacım var, bu nedenle yalnızca bunlar güncellemeye dahil edildi.
== DÜZENLEME == Örneğin
...
public class Person
{
public virtual int PersonId { get; set; }
public virtual string Firstname { get; set; }
public virtual string Nickname { get; set; }
public virtual string Surname { get; set; }
public virtual DateTime BirthDate { get; set; }
}
Ve test durumu.
// Create the transient entity
Person p = new Person()
p.id = 1;
using (ISession session = factory.OpenSession())
{
session.Update(p);
// Update the entity – now attached to session
p.Firstname = “Bob”;
session.Flush();
}
Ben ‘UPDATE kişiler SET Isim =‘Bob’NEREDE PersonID = 1’ benzer bir SQL deyimi oluşturmak için umuyordum. Bunun yerine, BirthDate'in başlatılmaması nedeniyle bir DateTime aralık aralığı dışında bir durum alıyorum. SQL deyimi için gerekli olmadığından Doğum Tarihi'ne gerek duyulmamalıdır. Belki bu mümkün değil mi? peşin
==/DÜZENLEME ==
sayesinde John
de bu kullanmanın performans etkileri de vardır , Ben statik güncelleştirmeleri kullanarak (genel) nhibernate sessionfactory inşa edildiğinde güncelleştirme deyimleri hazırladığı nedeniyle daha performanslı olduğuna inanıyorum. – DanP
Merhaba James, Yanıt için teşekkürler. Varlık için ayarlanmış DynamicUpdate (akıcı haritalama) var. Belki bir örnek problemi daha açık bir şekilde gösterecektir. Lütfen yukarıda düzenlenen bölümlere bakınız. – John
API'nın bu durumda sezgisel olmadığını kabul etmeliyim;) 'real-world' uygulamasında session.Lock() kullanarak test ettim ve tam olarak istediğim SQL'i döndürüyor. Bu James'le ilgili yardımlarınız için çok teşekkürler. – John