2008-09-02 3 views
6

Wie kann ich eine Entität aktualisieren, die von der Datenbank getrennt ist?Update in Linq

Der folgende Code wird nicht korrekt ausgeführt und löst InvalidOperationExcepiton aus.

public void Foo() 
{ 
DataContext context = new DataContext(); 
LinqEntity item = new LinqEntity(){ Id = 1, Name = "John", Surname = "Doe"} ; 
context.LinqEntities.Attach(item, true); 
} 

Antwort

3

Standardmäßig verwenden die Entitäten alle Felder, um die Parallelität beim Bearbeiten zu überprüfen. Das wirft die InvalidOperationException.

Dies kann die Eigenschaft Update Check für alle Felder auf Nie setzen. Dies muss in allen Feldern geschehen, um die Entität als modifiziert anzuhängen. Wenn dies geschieht, speichert ein zusätzlicher Aufruf von context.SubmitChanges() die Daten.

Wenn Sie die ursprünglichen Werte kennen, können Sie alternativ die Änderungen anhängen und dann die Aktualisierungen vornehmen. Alle Werte, die überprüft werden, müssen jedoch den ursprünglichen Werten entsprechen.

LinqEntity item = new LinqEntity(){ Id = 1, Name = "OldName", Surname = "OldSurname"}; 
context.LinqEntities.Attach(item); 
item.Name = "John"; 
item.Surname = "Doe"; 
context.SubmitChanges(); 
1

Ich bin mir nicht sicher, was Sie meinen, indem Sie von der Datenbank trennen.

Es scheint, dass Sie versuchen, eine neue Zeile in die LinqEntities-Tabelle einzufügen - ist das korrekt?

Wenn das der Fall ist, Sie

context.LinqEntities.InsertOnSubmit(item); 
context.Submit(); 
1

OK tun wollen werden, wenn Sie mit ID = 1, eine Zeile aktualisieren Sie versuchen, wird es wie folgt tun:

DataContext context = new DataContext(); 
LinqEntity item = (from le in context.LinqEntities 
        where le.ID == 1 
        select le).Single(); 
item.Name = "John"; 
item.Surname = "Doe"; 

context.Submit(); 

LinqEntity item = context.LinqEntities.Single(le => le.ID == 1); 

das wichtigste der Datacontext tut, ist trac:

Sie könnten auch die Linq-Ausdruck mit einem prägnanten Lambda ersetzen k alle Änderungen, die Sie vornehmen, sodass beim Aufruf der Submit-Methode automatisch die Insert-Anweisungen für die von Ihnen geänderten Dinge generiert werden.

0

Wenn Sie ein ORM verwenden, wählen Sie in der Regel ein Objekt aus, bevor Sie es aktualisieren.

Sie können DataContext.ExecuteCommand(...) verwenden, um das ORM zu umgehen, wenn Sie keine Auswahl vornehmen möchten.

+0

Ich stimme der Aussage nicht zu, dass dieses Verhalten typisch ist. Dies ist bei ORM, die das ActiveRecord-Muster implementieren, nicht der Fall. Nach Meinung vieler ist dies eine Einschränkung von Linq To SQL. Einige gute Diskussion hier: http://www.west-wind.com/Weblog/posts/135659.aspx –

+0

Linq-to-Sql implementiert Active Record nicht. – liammclennan