Nhibernate - 更新单个字段而不加载实体?

And*_*ndy 12 c# nhibernate

我有一个用例,用户可以获得产品列表,并可以选择多个产品并激活或停用它们.

这个列表的模型是不可变的,我有一个存储库,它取一个应该停用它们的模型列表.

我确实有另一个完整的产品编辑模型,但我不需要加载数百个只需更改一列.

我正在使用Session.CreateQuery,但有没有更好的方法来实现这个?

Die*_*hon 32

HQL是要走的路.

Session.CreateQuery("update Product set Active = :active where id in (:ids)")
       .SetParameter("active", active)
       .SetParameterList("ids", listOfSelectedProductIds)
       .ExecuteUpdate();
Run Code Online (Sandbox Code Playgroud)

  • ORM的主要目的之一是避免编写查询.您的解决方案将所有反模式组合在一个包中:1)内联DB语句; 2)使用一个巨大的抽象层--NH - 基本上称为一个简单的SQL语句 - 没有充分的理由和巨大的成本; 3)不使用数据模型映射.(请不要冒犯) (8认同)
  • 你错过了这一点.事实上它使用映射来执行本质上是一个美化的字符串替换操作会使它变得更糟,而不是更好.是的,它使用映射,这意味着抽象层的所有开销,但它仍然使您编写内联查询(即使它是"HQL"),这意味着内联查询的所有不可靠性和不可维护性. (6认同)
  • 有没有没有HQL的方法?我想使用已经存在的映射而不是编写内联查询,这首先是ORM背后的想法. (4认同)
  • 你自便.再一次,我不是为了得到你,你的答案是一个有效的答案 - 即使我认为这是一个糟糕的方法. (2认同)

小智 7

从 NHibernate 5 开始,您可以使用 LINQ 进行更新/删除,如下所示:

session.Query<Product>()
    .Where(p => listOfSelectedProductIds.Contains(p.Id))
    .Update(p => new { Active = active });
Run Code Online (Sandbox Code Playgroud)

它不会加载实体或增加版本。

https://nhibernate.info/doc/nhibernate-reference/querylinq.html#querylinq-modifying