Ho lavorato con ASP.NET Core per creare l'API e per l'accesso ai dati sto usando EF Core. Navigando su Stackoverflow e Google, non riesco a trovare un modo per aggiornare solo le colonne modificate con il modello di repository.
C'è un modo per verificare se i valori sono cambiati o no?
public virtual void Update(T entity)
{
// DbContext.Attach(entity);
var dbEntityEntry = DbContext.Entry(entity);
foreach (var property in dbEntityEntry.Properties)
{
var original = dbEntityEntry.OriginalValues.GetValue<object>(property.Metadata.Name);
var current = dbEntityEntry.CurrentValues.GetValue<object>(property.Metadata.Name);
if (original != null && !original.Equals(current))
dbEntityEntry.Property(property.Metadata.Name).IsModified = true;
}
}
Ho provato ad implementare come EF 6 ma sta lanciando una InvalidCastException
System.InvalidCastException: 'Impossibile lanciare l'oggetto di tipo System.Func'2 [Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry, System.Int32]' per digitare 'System.Func`2 [Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry , System.Object] ''
Sto aggiornando direttamente l'oggetto ricevuto dal client nel controller di azione e aggiornandolo.
Qualsiasi aiuto sarebbe molto apprezzato.
Grazie
Se l'Entità T originale che il tuo passaggio non è originariamente recuperato da dbContext, allora l'entità non verrà tracciata, quindi EF stesso non sarà in grado di tenere traccia delle proprietà modificate o meno.
Anche chiamare dbContext.Update contrassegna tutte le proprietà di un'entità come sporche in entrambi i casi.
Il miglior suggerimento sarebbe quello di recuperare prima l'entità dal DBContext, quindi utilizzare qualcosa come automapper per mappare le proprietà dell'entità passata al modello recuperato, quindi chiamare DbContext.SaveChanges () questo aggiornerà solo le proprietà che sono state modificate durante la mappa. Automapper si occuperà solo delle proprietà di mappatura che esistono su entrambi i lati e puoi configurare il mapping se hai bisogno di un controllo più fine.
Codice Psuedo di seguito:
public virtual void Update(T entity)
{
var existingEntity = DbContext.Entity.First(x => x.Id == entity.Id);
autoMapper.Map(entity, existingEntity);
DbContext.SaveChanges();
}