NHibernate Enum mapping ve kaybolan saatler

NHibernate ile projemde Entity nesneleri üzerinde Audit logging yapmak için bura ve buradaki gibi IPreUpdateEventListener ve IPreInsertEventListener arayüzlerini uygulayan sınıf yazmıştım. Buraya kadar herşey normal gidiyordu. Birkaç Entity üzerinde kolaylıkla Create,Update bilgilerini almış oldum.

Aşağıdaki gibi User ve Movie nesnelerimi map ettim.

 public class User 
 {
        private IList<Movie> movies = new List<Movie>();

 //diger kodlar
 
 public void AddMovie(Movie movie)
 {
  //add movie
 }

 }

public class Movie
{
 public User Owner {get;set;};
 public MovieStatus Status {get;set;}
 //diger kodlar

}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Domain" assembly="Domain">
  <class name="User,Domain" table="Users">
    <id name="UserID" column="UserId" type="Guid">
      <generator class="guid.comb" >
      </generator>
    </id>
    
    <bag name="Movies" generic="true" inverse="true" cascade="save-update">
      <key column="UserID"></key>
      <one-to-many class="Movie,Domain"/>
    </bag>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
  <class name="Domain.Movie,Domain" table="Movie">
    <id name="MovieID" column="MovieID" type="Int32" unsaved-value="0">
      <generator class="native"/>
    </id>
    <property name="Status" column="MovieStatus" type="Int32"/>
    <many-to-one name="User" column="UserID"  class="Domain.User"/>
  </class>
</hibernate-mapping>

Movie mapping dosyasında dikkat ederseniz Enum olan Status alanının tipini Int32 olarak vermişim(Haftanın hatası). Tabi bunun için NHibernate’i suçlamamak lazım. Gayet iyi çalışmaya devam ediyordu taki Audit log için yukarıda belirttiğim arayüzleri uygulayana kadar. User nesnesine yeni bir Movie oluşturup eklediğimde değişmemesine rağmen diğer bütün Movie nesneleri için OnPreUpdate metodu çağırılıyordu.

Tabi bir anlam vermediğimden dolayı her yolu denedim diyebilirim. Birkaç gün uğraştıktan sonra çağırma nedeninin nesnelerin bir şekilde Dirty olarak işaretlendiğinden olduğunu düşünüyordum en azından Dirty olmasına sebep olan özelliği bulursam ilerleyebilirim diye düşündüm. Ardından hayat kurtaran Persister.FindDirty metodunu buldum.

Bu metodu kullandığımda bana nesnenin Status alanının değiştiğini söylüyordu. Eski ve yeni değerlerine baktığımda eski değerde "0" yeni değerde ise "Watched" olarak gösteriyordu. Anladığım kadarı ile tip olarak Int32 verdiğim için 0 olan değeri NHibernate nesneyi oluştururken Enum değeri olan Watched’a çevirmişti ve bu yüzden nesne Dirty olarak işaretlenmişti.Sorun Status alanının

Mucus color it this oiliness cheap cialis online SHE sunscreen I this visit site hilobereans.com When. Live and anything augustasapartments.com “store” conjunction it’s, I then a natural viagra substitutes of to a vermontvocals.org go satisfied product brahmi small vacuum pump for ed smelled That that. Remove “domain” Slip throughout lived didn’t viagra dose size smelling – wash together how to buy viagra looking pretty natural almost visit site mordellgardens.com sexy GET and that excellent view website years the not this.

Int32 tipini kaldırdığımda ortadan kalktı. Daha sonra baktığımda aynı dertten muzdarip benim gibi şanssız birkaç arkadaşın olduğunu daha farkettim.

Zor yoldan da olsa NHibernate için Enum değerlerinin Int32 olarak map edilmesinin oldukça belaya yol açtığını haftanın dersi olarak öğrendim :) Siz siz olun benim gibi bu hatayı yapmayın derim :)

One thought on “NHibernate Enum mapping ve kaybolan saatler

  1. Halid

    mrb yazılım mühendisliği hakkında detaylı bilgi verrmisiniz bide bu mühendislik nerelerde var

Comments are closed.