2016-08-29 2 views
2

Ich glaube, das ist woanders gefragt, aber ich kann keine direkte Lösung finden. Meine Api übergibt das Objektmodell und auf der Serverseite wird jeder Wert des Objekts, der nicht übergeben wird, als null betrachtet (macht Sinn). Ist es möglich, dass ich EF6 mitteilen kann, Entity nicht mit NULL-Werten vom übergebenen Objekt zu aktualisieren, muss ich nicht jede Eigenschaft schreiben und prüfen, ob sie null ist.EF Repository mit UoW Update

Pseudo-Code

API

Update(int id, TaskEntity obj) 
{ 
    unitOfWork.Tasks.Update(id, userTask); 
    ... 
    unitOfWork.Save() 
} 

Repo Update

Update(int id, T entity) 
     { 
      var existingRecord = Get(id); //Gets entity from db based on passed id 
      if (existingRecord != null) 
      { 
       var attachedEntry = Context.Entry(existingRecord); 
       attachedEntry.CurrentValues.SetValues(entity); 
      } 
     } 

Mein Problem ist, dass alle Daten mit Nullwerten tatsächlich vorhandenen db Rekordwert mit Nullen überschreiben.

Bitte weisen Sie mich auf eine Lösung oder einen Artikel, wo dies gelöst ist. Sollte ich Reflexionen machen, könnte Auto-Mapper dies vielleicht handhaben (es ist nicht der Zweck, den ich glaube), oder irgendeine Art von Hilfsmethode sollte geschrieben werden, da meine Objekte Unterobjekte enthalten können.

Vielen Dank im Voraus.

+0

Haben Sie die Liste der Eigenschaften in TaskEntity, die Sie in dieser Update-Methode aktualisieren werden? Oder Sie möchten alle Eigenschaften aktualisieren, die nicht null sind. Aber wie unterscheiden Sie dann zwischen einem Wert, der nicht angegeben wurde, und einem Wert, den ich auf null setzen/aktualisieren möchte? – Developer

+0

Wenn ich Ihre Frage richtig verstanden habe, könnten Sie alle relevanten Informationen an die Methode übergeben und die gesamte Aktualisierung der Entität durchführen. – Eldho

+0

Wenn Sie Reflektion verwenden möchten, können Sie dies http://stackoverflow.com/questions/17385472/entity-framework-only-update-values-that-are-not-null tun. Aber ich persönlich fühle mich nicht das beste Ding – Eldho

Antwort

5

Sie können wie etwas tun, um diese

Update(int id, T entity,string[] excludedFields) 
{ 
    var existingRecord = Get(id); //Gets entity from db based on passed id 
    if (existingRecord != null) 
    { 
      var attachedEntry = Context.Entry(existingRecord); 
      attachedEntry.CurrentValues.SetValues(entity); 
      for(var field in excludedFields) 
      { 
       attachedEntry.Property(field).IsModified = false; 
      } 
    } 
} 

einiger scenaries erfordert, dass Sie einen Teil des Objekts und manchmal auch andere Teile zu aktualisieren, der beste Weg, meiner Meinung nach ist die Felder, um von der Aktualisierung ausschließen

hoffe, es wird Ihnen helfen

+0

Ich habe eine Art von Lösung gesehen, werde ich wahrscheinlich mit einer Art von boolean enden, die bestimmen wird, sollte in Null übergeben werden ignoriert oder aktualisiert werden, danke für die Antwort – Raimonds

1

Persönlich kein großer Fan der Datenbank zu schlagen und eine Operation vor einem Update zu tun. Möglicherweise können Sie während des Ajax-Aufrufs eine Liste von Eigenschaften senden, die Sie aktualisieren sollten (so dass auch das Szenario behandelt wird, in dem auf Nullwerte aktualisiert wird und vorhandene Werte gelöscht werden).

Ich mache kleine Änderungen an, was @Hadi Hassan getan hat (ohne Datenbank schlägt für das Unternehmen zu bekommen):

Update(T entity,string[] includedFields) 
{ 
    var existingRecord = Context.Attach(entity); // assuming primary key (id) will be there in this entity 
    var attachedEntry = Context.Entry(existingRecord); 

    for(var field in includedFields) 
    { 
     attachedEntry.Property(field).IsModified = true; 
    } 

} 

Hinweis - attachedEntry.Property (Feld) .IsModified nicht für verwandte Arbeit Entitäten

Verwandte Themen