2010-07-21 5 views
9

Ich möchte das einzige Feld der Entität aktualisieren, wenn ich Entitäts-ID kenne.LINQ to SQL: wie das einzige Feld zu aktualisieren, ohne vollständige Entität abrufen

Ist es in LINQ to SQL möglich, ohne vollständige Entität (mit allen Feldern von DataContext, die Overhead ist) abrufen? Ist es möglich, Entity zu DataContext zu erstellen und anzuhängen und das genaue Feld (die exakt zu synchronisierenden Felder) für DataContext.SubmitChanges (oder etwas Ähnliches) zu markieren?

Vielen Dank im Voraus!

Antwort

8

Ja, Sie können:

Foo foo=new Foo { FooId=fooId }; // create obj and set keys 
context.Foos.Attach(foo); 
foo.Name="test"; 
context.SubmitChanges(); 

In Ihrem Dbml gesetzt Updatecheck = "Nie" für alle Eigenschaften Dieses Beispiel wird der Vorname der Person ändern.

Dies generiert eine einzelne Update-Anweisung ohne Auswahl.

Eine Einschränkung: wenn Sie wollen in der Lage sein Name auf null gesetzt würden Sie Ihre Foo Objekt auf einen anderen Wert initialisiert werden müssen, um so Linq die Änderung erkennen kann:

Foo foo=new Foo { FooId=fooId, Name="###" }; 
... 
foo.Name=null; 

Wenn Sie überprüfen möchten ein Zeitstempel während der Aktualisierung können Sie dies auch tun:

Foo foo=new Foo { FooId=fooId, Modified=... }; 
// Modified needs to be set to UpdateCheck="Always" in the dbml 
+0

Klingt interessant. Ich werde es in ein paar Tagen versuchen! –

+1

Ah ja, ähnliche Ansatz funktioniert in EF. Obwohl ich EntityKey Eigenschaft sowie Wert für Primärschlüsseleigenschaft erzeugen muss. –

1

können Sie immer eine Standard-T-SQL-Anweisung erstellen und auszuführen, dass gegen Ihre Datenspeicher:

YourDataContext 
    .ExecuteCommand("UPDATE dbo.YourTable SET ThatField = newValue WHERE ID = 777", null); 

Mit Linq-to-SQL selbst, können Sie dies nicht tun können - es ist Grundvoraussetzung ist, dass es immer funktioniert auf das Objekt, das ganze Objekt und nichts als das Objekt.

Wenn Sie dies regelmäßig tun müssen, besteht eine Möglichkeit darin, es in eine gespeicherte Prozedur zu packen und diese gespeicherte Prozedur in Ihren Datenkontext als eine Methode einzufügen, die Sie im Datenkontext aufrufen können.

+0

OMG, es ist schade. Hat sich die Situation in EF geändert? Würden Sie sich persönlich auf eingebettete T-SQL-Operatoren oder Stored Procedures verlassen, die in Model für solche Fälle eingebettet sind? –

+0

Nein - EF hat den gleichen Ansatz - aber auch NHibernate oder einen der anderen OR-Mapper. Sie sind entworfen, um ** Objekte ** als Ganzes zu laden, zu manipulieren und zu speichern. Mir ist kein ORM bekannt, das es Ihnen ermöglichen würde, nur ein oder zwei Felder abzurufen, zu ändern und zu speichern .... –

+0

In EF können wir In-Memory-Entity erstellen, EntityKey-Eigenschaft + Primärschlüsseleigenschaft initiieren, dann anhängen, dann Ändern Sie die Eigenschaften, die wir aktualisieren möchten. SaveChanges funktioniert für Updates. –

1

Sie können das Objekt aktualisieren.

Person person = _entities.Persons.FirstOrDefault(p => p.Id == id); 
person.FirstName = "Bill"; 
_entities.Refresh(System.Data.Objects.RefreshMode.ClientWins, person); 
_entities.SaveChanges(); 
+1

Danke, @Gnome. Aber ist es möglich, das Feld zu aktualisieren, ohne dass die Entity abgerufen wird? –

+0

;-) Ich habe gerade Ihren Beitrag neu gelesen. Soweit ich weiß, wirst du die Entität brauchen. Aber diese Lösung vermeidet diese Old-School-SQL. – gnome

+1

ja, es vermeidet die "old-school" SQL - aber es muss zuerst die vollständige Entität abrufen, und wird die gesamte Entität erneut speichern. Die "old school" SQL kann das sehr leicht umgehen ... –

Verwandte Themen