如何使用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)
使用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 以检索映射列,如{{3 }} these。