İki varlıkla (Veli ve Çocuk) arasında ana çocuk ilişkisi var. aşağıdaki gibiKoleksiyondan bir öğenin kaldırılması (NHibernate)
Benim Veli haritalama geçerli:
<class name="Parent" table="Parents">
...
<bag name="Children" cascade="all">
<key column="ParentID"></key>
<one-to-many class="Child"></one-to-many>
</bag>
</class>
aşağıdaki yürütmek istiyorum:
someParent.Children.Remove(someChild);
Çocuk sınıfı Model, başka ana sınıfına bir referansı vardır. ilişki
gibi Not görünür: Yukarıda bağlantılı olmayan url dolayı özür, ben Bundan dolayı İşaretleme
kullanan URL dizesinde yıldız işareti geçmiş olsun gibi görünüyor olabilir ilişki, yukarıdaki kod çağrıldığında, DELETE sorgusu yerine, Child tablosundan ParentID'yi kaldıran bir UPDATE sorgusu oluşturulur (null olarak ayarlar).
NHibernate'i, Parent.Children koleksiyonundan kaldırıldığında, çocuk kaydını tamamen silmeye zorlamak mümkün mü?
GÜNCELLEME Spencer'ın Çözüm
Çok çekici çözümü @
bu gelecek sınıflarında uygulanacak bir şeydir olarak. Bununla birlikte, oturumlar, depo modelinde (özel durumumda) ele alınma şekline bağlı olarak, uygulamaya bağlı olarak oturum türlerini (CallSessionContext/WebSessionContext) geçmemiz gerektiği için bu imkansızdır.
Jamie'nin ÇözümBasit ve uygulanması için hızlı, ancak isabet ettik başka yol bloğu @. şöyle Çocuğum varlık arar:
yeni yöntemi kullanarak NHibernate düpedüz tek silme aksine, null TypeId ve parentId ayarı bir güncelleme deyimi oluşturur. Eğer uygulama içinde bir şeyi özlediysem, bu yöntemin ilerlemek için ağrısız olacağını bilmeme izin verin.
@The One-Shot-Delete solution described here, tek bir silme zorlamak için koleksiyonun kaldırılmasıyla ilgili bir fikri özetlemektedir. Ancak yukarıdaki gibi aynı sonuçlar, bir güncelleme beyanı verilir.
//Instantiate new collection and add persisted items
List<Child> children = new List<Child>();
children.AddRange(parent.Children);
//Find and remove requested items from new collection
var childrenToRemove = children
.Where(c => c.Type.TypeID == 1)
.ToList();
foreach (var c in childrenToRemove) { children.Remove(m); }
parent.Children = null;
//Set persisted collection to new list
parent.Children = Children;
Çözüm kazma biraz aldı ama Jamie'nin çözüm bazı ek değişikliklerle geldi. = Ters = true, Cascade tüm
Veli eşlemesi - - Ters = true, Cascade = hepsi silme-yetim
gibi yöntemleri çıkarın
Tip haritalama: Gelecekteki okuyucuların, yukarıda benim sınıf modeline dayalı Jamie'nin çözüm çalışmalarında anlatılmıştır.Bu öksüz öğe başına tek bir silme ifadesi üretiyor, bu yüzden gelecekte ayarlama imkanı var, ancak sonuç başarılı.
Bu yolun beni doğru yola soktuğuna inanıyorum, yol blokları şu şekildedir: bunu bir havuz düzeninde ayarlama (yani, bu durumda çocuk Silme yöntemi kendi depo yöntemini çağırır) ve aynı zamanda Bu farklı oturum bağlamları ile (örneğin, CallSessionContext vs WebSessionContext) –