2016-11-25 63 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