NHibernate中是否存在批量更新命令?据我所知,它没有.那么处理这种情况的最佳方法是什么?我想做以下事情:
List<User>从数据库中获取对象列表(让我们称之为用户列表)Users.Foreach(User=>User.Country="Antartica")Users.Foreach(User=>NHibernate.Session.Update(User)).Session.Flush更新数据库.这是一个好方法吗?这会导致我的代码和数据库之间的往返很多次吗?
你怎么看?还是有更优雅的解决方案?
MPr*_*ard 41
我知道我已经迟到了,但是你想知道现在可以在NHibernate 2.1+中使用HQL
session.CreateQuery(@"update Users set Country = 'Antarctica'")
.ExecuteUpdate();
Run Code Online (Sandbox Code Playgroud)
mar*_*sks 20
启动NHibernate 3.2批处理作业有一些改进,可以最大限度地减少数据库往返.有关更多信息,请访问HunabKu博客.这是一个例子 - 这些批量更新只进行了6次往返:
using (ISession s = OpenSession())
using (s.BeginTransaction())
{
for (int i = 0; i < 12; i++)
{
var user = new User {UserName = "user-" + i};
var group = new Group {Name = "group-" + i};
s.Save(user);
s.Save(group);
user.AddMembership(group);
}
s.Transaction.Commit();
}
Run Code Online (Sandbox Code Playgroud)
您可以在nhibernate配置文件中设置更新的批处理大小.
<property name="hibernate.adonet.batch_size">16</property>
Run Code Online (Sandbox Code Playgroud)
而且你不需要在那里调用Session.Update(User) - 只需刷新或提交一个事务,NHibernate就会为你处理事情.
编辑:我打算发布链接到nhibernate文档的相关部分,但该网站已关闭 - 这是Ayende关于该主题的旧帖子:
至于在这里使用NHibernate(或任何ORM)是否是一种好方法,它取决于上下文.如果你用一个值对一个大表中的每一行进行一次性更新(比如将所有用户设置为国家'Antarctica'(这是一个大陆,顺便说一下不是一个国家!),那么你应该使用sql UPDATE语句.如果您要在应用程序的一般用法中将国家/地区作为业务逻辑的一部分一次更新多个记录,那么使用ORM可能是一种更明智的方法.这取决于数量每次更新的行数.
如果您不确定,这里最明智的选择可能是在NHibernate中调整batch_size选项,看看它是如何工作的.如果系统的性能不可接受,那么您可能会在代码中实现直接的sql UPDATE语句.
从NHibernate 5.0开始,可以使用LINQ进行批量操作.
session.Query<Cat>()
.Where(c => c.BodyWeight > 20)
.Update(c => new { BodyWeight = c.BodyWeight / 2 });
Run Code Online (Sandbox Code Playgroud)
NHibernate将生成单个"更新"sql查询.
请参阅更新实体
| 归档时间: |
|
| 查看次数: |
29419 次 |
| 最近记录: |