2016-11-25 61 views
0

如何執行刪除查詢使用NHibernate的除主鍵以外的實體類中的任何字段名?NHibernate的 - 刪除除主鍵以外的字段名稱

我這樣做:

public static void Delete<TEntity>(this ISession nhSession, string fieldName, object fieldValue) where TEntity : class 
{//Delete by field name 
    TEntity instance = (TEntity)Activator.CreateInstance(typeof(TEntity), new object[] { }); 
    nhSession.CreateQuery(string.Format("DELETE FROM {0} WHERE " + fieldName + " = (:fieldValue)", instance)) 
      .SetParameter("fieldValue", fieldValue) 
      .ExecuteUpdate(); 
} 

我可以調用這個如下:

nhSession.Delete<MyEntity>("MyFieldName", "ValueOfFieldToDelete"); 

這工作,但我需要作爲串場的傳遞名。爲此,調用者必須知道我想避免的數據庫腳本。

我想打個電話類似如下:

nhSession.Delete<MyEntity>(myEntityInstance.MyFieldName, "ValueOfFieldToDelete"); 

OR

nhSession.Delete<MyEntity>(x => x.MyFieldName, "ValueOfFieldToDelete"); 

這樣,來電者不需要輸入硬編碼字符串。

注意:我的實體字段名稱與基礎數據庫字段名稱不同。

這可能嗎?如果是,如何?

+0

你的房產名稱和房屋名稱是否匹配? –

+0

這篇文章演示瞭如何獲取列名以及屬性名稱。 http://stackoverflow.com/questions/1800930/getting-class-field-names-and-table-column-names-from-nhibernate-metadata –

+0

我不知道它的問題。我將'CreateQuery()'方法與'CreateSqlQuery()'混淆了,我想知道查詢如何處理與屬性名稱不匹配的列名稱。由於'CreateQuery()'是HQL,這不是問題。 –

回答

0

this answer使用GetPropertyName方法,你可以添加其他擴展方法

public static void Delete<TEntity>(this ISession nhSession, Expression<Func<TEntity, object>> field, object fieldValue) where TEntity : class 
{ 
    nhSession.Delete<TEntity>(GetPropertyName(field), fieldValue); 
} 

可以調用引用這樣一個lambda表達式屬性:

nhSession.Delete<Person>("LastName", "Smith"); 
nhSession.Delete<Person>(p => p.LastName, "Smith"); 

更新:如果屬性名稱與映射的數據庫列名稱不同,您需要訪問類NHibernate persister來檢索e如theseanswers所示的映射列。

+0

查看有關NH持卡人的更新答案 – devio