2017-08-04 31 views
0

Ich arbeite in Webapi. Ich habe eine Update-Methode, um Änderungen vorzunehmen. Es gibt eine Reihe von Eigenschaften, aber ich möchte nur einige Felder aktualisieren.UnModified Felder erhalten nicht WebAPI

Also übersprang ich einfach die unerwünschten Felder mit entry.Property (propertyName) .IsModified = false; in Datenschicht. All meine Logik funktioniert gut, aber nach dem Update, wenn ich den neuen Update Eintrag bekam, es hat nicht die Felder, die nicht

My-Controller-Code aktualisiert:

[Route("{id:int}")] 
    public async Task<IHttpActionResult> Put(int id, MyModel model) 
    { 
     model.Id = id; 
     bool result = await _modelLogic.UpdateData(item); 
     if (!result) 
     { 
      return BadRequest("Could not Save to the database"); 
     } 
     return await GetModel(item.Id); 
    } 

    [Route("{id:int}", Name = "GetModelById")] 
    public async Task<IHttpActionResult> GetModel(int id) 
    { 
     MyModel model = await _modelLogic.GetModelAsync(id); 
     if (Model == null) 
     { 
      return NotFound(); 
     } 
     return Ok(model); 
    } 

My Business-Logik:

public async Task<bool> UpdateData(MyModel model) 
    { 
     model.RecordStatus = DataStatus.Active; 
     string[] excludedProperties = new[] {"RegistrationId", "StartDate", "ProtocolType", "Code" }; 
     _repo.Update(model, excludedProperties); 
     bool status = await _repo.SaveAsync(); 
     return status; 
    } 

Hier RegistrationId ist ein Fremdschlüssel.

Meine Daten Code:

public void Update(MyModel model, string[] excludedProperties) 
    { 
     excludedPropertiesInUpdate = excludedPropertiesInUpdate.Union(excludedProperties).ToArray(); 
     base.Update(model); 
    } 

Mein Generisches Repository/Base-Repository

internal string[] excludedPropertiesInUpdate = new[] { "CreatedDate", "CreatedBy" }; 
    public void Update(T entity) 
    { 
     entity.UpdatedDate = DateTime.UtcNow; 
     var entry = _context.Entry(entity); 
     entry.State = EntityState.Modified; 

     //Restrict Modification for Specified Properties 
     foreach(string propertyName in excludedPropertiesInUpdate) 
     { 
      entry.Property(propertyName).IsModified = false; 
     } 
    } 

Wie ich sagte, alle Logik funktioniert gut. Wenn die Antwort jedoch angezeigt wird, werden die nicht aktualisierten Felder als Null angezeigt. zB: RegistrationId, Code usw. Aber in der Datenbank ist dort nichts aktualisiert

+0

Ich empfehle, keine Objekte an die Ansicht zu übergeben, sondern ein Ansichtsmodell. Wenn Sie dieses Ansichtsmodell an die Domäne (Repository) übergeben, rufen Sie die aktuelle Entität ab und aktualisieren die gewünschten Felder. In Ihrem Beispiel: Was waren die Werte dieser #null-Felder im Modell, die Sie an das Repository übergeben haben? Es klingt fast so, als ob das Modell, das an das Repository gesendet wird, unvollständig ist, Sie haben es an den Kontext angehängt, es auf "Modified" gesetzt, einige Eigenschaften ignoriert, aber erwartete Werte aus der Datenbank, um die angehängte Entität zu füllen? (Eintrag) –

+0

@StevePy danke. Ich habe bereits nur Viewmodel verwendet. Die Eigenschaften, die nicht übergeben werden (als nicht modifiziert markiert), werden als Null zurückgegeben, aber in DB-Werten werden sie nicht aktualisiert. Ich habe auch die gleiche Art und Weise wie Sie gesagt haben, indem Sie existierende Objekte genommen und die Eigenschaften aktualisiert haben, während Sie updaten. In diesem Fall habe ich einen Fehler, wie Sie einen anderen Kontext mit dem gleichen Primärschlüssel haben – Akhil

+0

Aussehen wie Sie sollten einige Eigenschaften als [berechnet oder Identität] (https://msdn.microsoft.com/en-us/library/system.componentmodel .dataannotations.schema.databasegeneratedoption (v = vs.110) .aspx). –

Antwort

0

Sie speichern nur neue Werte in der Datenbank, aber laden Sie nicht unmodifizierte Eigenschaften zu Entität.

internal string[] excludedPropertiesInUpdate = new[] { "CreatedDate", "CreatedBy" }; 
public void Update(T entity) 
{ 
    entity.UpdatedDate = DateTime.UtcNow; 
    var entry = _context.Entry(entity); 
    entry.State = EntityState.Modified; 

    //Restrict Modification for Specified Properties 
    foreach(string propertyName in excludedPropertiesInUpdate) 
    { 
     entry.Property(propertyName).IsModified = false; 
    } 
    _context.SaveChanges(); 

    //load actual values from the database. 
    entry.Reload(); 
} 
+0

Dadurch werden die tatsächlichen Werte neu geladen und der Status als unverändert festgelegt. Also Update wird nicht passieren – Akhil

+0

Sie haben Recht! 'SaveChanges()' sollte vor dem Aufruf von 'Reload()' platziert werden. Oder den tatsächlichen Wert erhalten, nachdem das Modell in der Datenbank aktualisiert wurde. Ich habe meine Antwort aktualisiert. –

+0

aber hier bin ich nicht speichern Änderungen hier speichern. seine andere Methode. Aber wenn Sie den Code in api sehen, die get-Methode bereits nach dem Update aufgerufen passiert – Akhil