Как сделать массовое обновление в nhibernate? - PullRequest
8 голосов
/ 18 апреля 2011

Мне интересно, как сделать массовое обновление? Я хочу сделать предложение where и захватить все элементы, которые соответствуют предложению where Where(x => x.Id == 1).ToList(), а затем выполнить обновление для всех из них.

// change every name to bob
A.Name = "bob"
// then do a mass update

Должен ли я сделать цикл foreach? И пройти через каждый из них, а затем отправить его для обновления или есть другой способ сделать это?

Спасибо

Редактировать

У меня есть это

// in my repo;
  private readonly ISession session;

 // session done with ninject IOC
public MyRepo(ISession session)
{
   this.session = session;
}

public void MassUpdate(int id, string prefix)
{
         var query = "UPDATE TableA SET Name= (:prefix) WHERE Id IN (:Id)";
          session.CreateQuery(query).SetParameter("prefix", prefix).SetParameter("Id",Id);
}

 public void Insert(MyClass myClass)
 {
    sesson.save(myClass);
 }

public void Commit()
{
    using (ITransaction transaction = session.BeginTransaction())
     {
                    transaction.Commit();
     }
}

 // service layer method

 public void myMethod()
 {
     MyClass myClass = nw MyClass() { Name = "test"};
     MyRepo r = new Repo();
     r.MassUpdate(1,"bob");
     r.Insert(myClass);
     r.Commit();
 }

Так, как я могу настроить мой MassUpdate для выполнения в Commit (). Обратите внимание, что эта фиксация используется для всех методов в MyRepo, поэтому я не могу вставить команду execute в метод фиксации.

Ответы [ 3 ]

10 голосов
/ 18 апреля 2011

Расширяя ответы Диего, вы можете использовать HQL для отправки списка аргументов:

var person = 25;
var query = "update Foo set Name = 'bob' where id = :person";
var update = session.CreateQuery(query)
                    .SetParameter("person", person);


/***
 *
 * Do Stuff
 *
 ***/

 update.ExecuteUpdate();
4 голосов
/ 18 апреля 2011
session.CreateQuery("update Foo set Name = 'bob' where id = 1")
       .ExecuteUpdate()
0 голосов
/ 01 апреля 2018

Извините, это поздний ответ, но только для того, чтобы вы знали, что лучшее решение (без запроса в виде простого текста) существует здесь: Эквивалент запроса массового обновления Linq для Nhibernate?

В вашем случаеэто будет применяться так:

session.Query<TableA>().Where(f => f.Id == id)
            .Update(i => new Foo { prefix = myPrefix });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...