NHibernate - 按主键以外的字段名称删除

时间:2016-11-25 14:03:27

标签: c# 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");

这样,调用者不需要输入硬编码字符串。

注意:我的实体字段名称与基础数据库字段名称不同。

这可能吗?如果是,怎么样?

1 个答案:

答案 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