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
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) –
@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
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). –