2011-02-19 51 views
0

我正在制定一個通用的nhibernate方法,它可以確定在運行時給定一個實例化的nhibernate映射對象,如果該對象被「數據庫」中的某個其他對象引用。在nhibernate中,如何確定映射實體是否具有cascade =「all」?

這樣,我就可以允許用戶刪除沒有被引用的對象,並且如果它們是引發錯誤的(還有一些關於有多少東西引用對象的信息)。

雖然其他對象引用了它,但我遇到了一個障礙,當一個實體映射cascade = all時,我希望它們能夠刪除這個東西。

所以,我只需要知道我可以如何使用Nhibernate.MetaData.IClassMetaData來確定'實體類型'或包是cascade = all。看了幾分鐘後我似乎無法找到它。

有什麼想法?

感謝

艾薩克

附:這裏是方法代碼(未完成)。 IDomainObject只是確保傳遞的對象具有int ID屬性。

public int getReferenceCount<T>(T objectToCheck) where T : Interfaces.IDomainObject 
    { 
     Type objectType = typeof(T); 
     string className = objectType.Name; 
     IDictionary<string, NHibernate.Metadata.IClassMetadata> myDictionary = session.SessionFactory.GetAllClassMetadata(); 
     int referenceCount = 0; 
     string fullClassName = objectType.FullName; 
     foreach (var thisClassPair in myDictionary) 
     { 
      NHibernate.Metadata.IClassMetadata thisClass = thisClassPair.Value; 
      for (int i = 0; i < thisClass.PropertyTypes.Length; i++) 
      { 

       string propertyName; 
       if (thisClass.PropertyTypes[i].Name == fullClassName) 
       { 
        if (thisClass.PropertyTypes[i] is NHibernate.Type.ManyToOneType || thisClass.PropertyTypes[i] is NHibernate.Type.OneToOneType) 
        { 
         propertyName = thisClass.PropertyNames[i]; 
         List<object> results = this.HQLQuery<object>("from " + thisClassPair.Key + " as refClass where refClass."+propertyName+".id = '"+objectToCheck.ID+"'"); 

        } 
       } 


      } 

     } 

     return 0; 
    } 
+0

你爲什麼不只是讓他們試着刪除對象(INT try塊),如果出現錯誤,他們展示對象引用。保持數據完整性是數據庫的工作,這就是爲什麼需要FK。 – 2011-02-19 06:55:25

+0

我不能因爲刪除的添加到一個事務,然後當他們點擊保存按鈕時放入。通過這種方式,他們不必等到他們保存以找出出錯的地方。 – 2011-11-04 07:07:22

回答

5
var persister = (NHibernate.Persister.Entity.AbstractEntityPersister)thisClass; 
var cascadeStyle = persister.GetCascadeStyle(i);