9 Stimmen

Wie kann man eine Massenaktualisierung in nhibernate durchführen?

Ich frage mich, wie man ein Massenupdate durchführt? Ich möchte eine Where-Klausel verwenden und alle Elemente erfassen, die diese Where-Klausel erfüllen Where(x => x.Id == 1).ToList() und dann eine Aktualisierung für alle vornehmen.

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

Muss ich eine foreach-Schleife ausführen? Und gehen Sie durch jeden einzelnen und dann senden Sie es aktualisiert werden oder gibt es eine andere Möglichkeit, dies zu tun?

Gracias

Editar

Ich habe diese

// 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();
 }

Wie kann ich also mein MassUpdate so einrichten, dass es bei Commit() ausgeführt wird? Beachten Sie, dass dieses Commit für alle Methoden in MyRepo verwendet wird, so dass ich die Ausführung nicht in die Commit-Methode stecken kann.

11voto

rebelliard Punkte 9472

Wenn Sie Diegos Antwort erweitern, können Sie HQL verwenden, um eine Liste von Argumenten zu senden:

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();

4voto

Diego Mijelshon Punkte 52110
session.CreateQuery("update Foo set Name = 'bob' where id = 1")
       .ExecuteUpdate()

1voto

Sÿl Punkte 555

Entschuldigen Sie die späte Antwort, aber nur damit Sie wissen, dass es eine bessere Lösung (ohne Abfrage im Klartext) hier gibt: Linq to Nhibernate Bulk Update Query Equivalent?

In Ihrem Fall würde es wie folgt angewandt werden:

session.Query<TableA>().Where(f => f.Id == id)
            .Update(i => new Foo { prefix = myPrefix });

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X