Ho un problema a causa del quale Entity Framework (Core) sta eliminando un oggetto al momento dell'aggiornamento. Penso che questo sia correlato ad Automapper (mappare la risorsa DTO sull'oggetto). Ho altri oggetti mappati esattamente allo stesso modo di questo oggetto e gli aggiornamenti funzionano bene.
public async Task<IActionResult> UpdateFeedback(Guid Id, [FromBody] FeedbackResource feedbackResource)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
//removing or else get a tracking error with EF
feedbackResource.FeedbackType = null;
var feedback = await feedbackRepository.GetFeedback(Id);
if (feedback == null)
return NotFound();
//if I use this line to map, EF will delete the object upon save.
mapper.Map<FeedbackResource, Feedback>(feedbackResource, feedback);
// if I map manually, i get no error
//feedback.Title = feedbackResource.Title;
//feedback.Details = feedbackResource.Details;
//feedback.IsGoodFeedback = feedbackResource.IsGoodFeedback;
//feedback.IsReviewed = feedbackResource.IsReviewed;
//feedback.FeedbackTypeId = feedbackResource.FeedbackTypeId;
//if(feedbackResource.IsReviewed){
// feedback.ReviewDate = DateTime.Now;
// feedback.ReviewedBy = UserId;
//} else {
// feedback.ReviewDate = null;
// feedback.ReviewedBy = null;
//}
await uow.CompleteAsync();
return Accepted(feedback);
}
Non ho idea di cosa risolvere qui e non riesco a vedere questo problema su qualsiasi ricerca su Google.
Mi trovavo di fronte a una situazione simile (ef core 1.1). Presumo che il tuo problema sia simile al mio.
Anche un problema simile è descritto qui
Ho i seguenti modelli:
1) ApplicatonUser - utente standard di EF
2) AnyDAL - qualsiasi classe nel DB, che ha un collegamento all'utente
public class AnyDAL
{
public long Id { get; set; }
public long UserId { get; set; }
public ApplicationUser User { get; set; }
}
3) AnyDTO - modello proveniente dal lato browser. Come il tuo [FromBody] FeedbackResource feedbackResource
public class AnyDTO
{
public long Id { get; set; }
public long UserId { get; set; }
/// It is root of all evil. See below.
/// And yes, it is bad practice.
public ApplicationUser User { get; set; }
}
Scenario:
1) ottenere AnyDAL
dal database;
2) mappare AnyDTO
su AnyDAL
usando AutoMapper _mapper.Map(DTO, DAL)
;
3) SaveChanges ()
In un caso, SaveChanges()
porta a Elimina, in altro a Aggiorna.
Cosa dovremmo sapere: nel mio caso la proprietà AnyDTO.User
è sempre null
dopo la deserializzazione.
La scelta tra elimina e aggiorna dipende dal valore della proprietà AnyDAL.User
prima della mappatura:
1) AnyDAL.User
è null - otteniamo l'aggiornamento.
2) AnyDAL.User
NON è null - otteniamo Elimina.
In altre parole. Se la proprietà AnyDAL.User
modificata da un valore a null, l'entità verrà eliminata. Nonostante il fatto che AnyDAL.UserId
rimanga lo stesso.
Esistono due modi per risolverlo:
1) Rimuovere la proprietà User
da AnyDTO
;
2) La proprietà AnyDTO.User
deve sempre avere valore.