Hinzufügen zur Where-Klausel eines Updates in LinQ-to-Entities

entity-framework linq linq-to-entities sql

Frage

Nehmen wir an, ich habe eine Tabelle namens Product mit drei Spalten: ID, CustomerId, Name. Id ist der Primärschlüssel. Das Schema liegt außerhalb der Kontrolle meiner Gruppe, und wir haben jetzt die Anforderung, CustomerId immer als Parameter für alle Abfragen (selects, updates, delete) anzugeben. Es ist eine lange Geschichte, auf die ich lieber nicht eingehen würde ... es beinhaltet Auslöser :-P

Meine Frage ist also, wenn ich eine verbundene Entität in LinqToEntities habe und einige Updates speichern möchte (in diesem Fall würde ich den Namen aktualisieren). Wie bekomme ich es, um die SQL zu generieren:

update Product set Name = @Name where Id=@Id and CustomerId=@CustomerId

Wobei der Parameter customerId zusätzlich zum Primärschlüssel in der where-Klausel enthalten ist.

Vielen Dank :-)

Akzeptierte Antwort

Hilft die CustomerId eindeutig, die Zeile nach @Id zu identifizieren? Ich habe dem "Trigger" -Bit nicht wirklich gefolgt, da das für das Update verwendete Prädikat dem Trigger nicht bekannt ist. Oder Sie möchten die CustomerId jedes Mal erneut aktualisieren (erkennbar an UPDATE(...) im Trigger)

Die einfachste Möglichkeit ist, es als Objektaktualisierung durchzuführen:

var qry = from product in model.Products
          where Id == @Id && CustomerId == @CustomerId
          select product;

foreach(Product p in qry) {
    p.Name = @Name;
}

model.SaveChanges(); // or whatever the method is in EF

Wenn Sie wissen, dass Sie einen Datensatz erwarten, können Sie Folgendes verwenden:

Product prod = (from product in model.Products
          where Id == @Id && CustomerId == @CustomerId
          select product).Single();

prod.Name = @Name;
mode.SaveChanges(); // ditto

Sie könnten es vielleicht auch als Entity-SQL schreiben, aber ich bin mir nicht sicher, ob ich es mir persönlich gestatten würde Nein, das geht nicht - du musst entweder den obigen Befehl oder einen regulären SQL-Befehl / SPROC verwenden.


Beliebte Antwort

Eine Möglichkeit wäre, eine gespeicherte Prozedur für die Aktualisierung zu verwenden . Dadurch haben Sie die vollständige Kontrolle über die SQL.

Eine andere Möglichkeit besteht darin, die CustomerId zum Entitätsschlüssel hinzuzufügen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum