2009-07-20 28 views
11

Etki alanı adımı devam ettirmek için DDD ve NHibernate kullanıyorum. Veritabanımda, bir varlıkla ilişkili olan her tablonun, denetim takibi için kullanılan dört ekstra sütunu (CreatedBy, UpdateBy, CreatedDate, UpdatedDate) vardır. Sadece toplama köklerinin kaydedilmesine izin veren depo desenini kullanıyorum. NHibernate, varlıkları toplanan kök üzerinde kaydetmeye çalıştığında, varlıkların denetim özelliklerinin ayarlanmadığı için SQL DateTime hatası alıyorum. NHibernate'de, kaydetmeden hemen önce nesnelerdeki özellikleri ayarlamak için bir yol var mı?NHibernate özellikleri otomatik olarak kaydediliyor

İşte küçük bir örnek. Toplam kök olan bir Sipariş nesnesine sahibim. Siparişin çocukları olan OrderNote nesneleri de var. Siparişe bir Sipariş Notu eklediğimde ve sonra Sipariş'i kaydettiğimde, CreatedDate/UpdateDate öğesi bir SQL DateTime taşmasına neden olacak DateTime.MinValue olarak ayarlandığından bir istisna atılır. Bu denetim sütunları kalıcılığın bir parçası olduğundan ve sorun etki alanıyla ilgili olmadığından, Not eklendiğinde bu özellikleri ayarlamak için Sipariş toplamını istemiyorum. Denetim sütunları/özellikleri yalnızca kalıcılık çerçevesi tarafından bilinmeli ve etki alanı tarafından bilinmelidir. NHibernate'i kaydederken veya güncellerken bu özellikleri ayarlamasını söyleyebilirim. Bunu yapmanın bir yolu var mı? bunu yapabilirsiniz

cevap

11

Müdahale:

http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-interceptors (9,10, bağlantı her zaman işe yaramaz). belgeden

Kes/yapıştır:

public class AuditInterceptor : IInterceptor 
{ 
    ... 

    public boolean OnSave(object entity, 
          object id, 
          object[] state, 
          string[] propertyNames, 
          IType[] types) 
    { 
     if (entity is IAuditable) 
     { 
      for (int i=0; i<propertyNames.Length; i++) 
      { 
       if ("CreateTimestamp" == propertyNames[i]) 
       { 
        state[i] = DateTime.Now; 
        return true; 
       } 
      } 
     } 
     return false; 
    } 

} 

OnFlushDirty() UpdatedDate için kullanılabilir.

Bir arabirim uygulamak için, Oluşturma Tarihi/Güncelleştiricisi olan her bir öğeyi isteyeceksiniz, böylece engelleyici, eylemin gerçekleştirilip gerçekleştirilmeyeceğini kontrol edebilir (sağlanan örnekte, IAuditable'tır).


Düzenleme

Hemen fark bölüm 11: Müdahale ve olaylar. Bazı yöntemleri geçersiz kılmanız gerektiğinde, işleri daha kolaylaştıran EmptyInterceptor'dan miras alabilirsiniz.

Olayları hiç kullanmamıştım. Ayrıca durumda size yardımcı olabilir NHibernate en sürüm sistemine bakabilir

+0

harika. Tam olarak aradığım şey bu. NHibernate için yeniyim ve bu özellikten habersizdim. Korumalı özellikler ile uygulanan bir IAuditable arabirim var, bu nedenle alan onları göremez. – awilinsk

1

;)