Quantcast
Channel: Active questions tagged blazor - Stack Overflow
Viewing all articles
Browse latest Browse all 4839

Issue with UpdateAsync method in Entity Framework Core – data not persisted in the database

$
0
0

I'm working on an ASP.NET Core application using Entity Framework Core, and I'm facing an issue with the UpdateAsync method in my repository. When I attempt to update an entry in the database, the data doesn't seem to update correctly or as expected. I've added some logs, but I still can't seem to resolve the problem.

application uses a HerstellerRepository to manage Hersteller , Modelle , and Farben entities.

I'm trying to update a Hersteller and its associated Modelle and Farben using the UpdateAsync method.

Symptoms:

  • The method executes without errors.
  • However, some properties remain unchanged in the database even though the UpdateAsync method is called.
  • The logs show that the data is modified in memory, but it doesn't reflect in the database after calling SaveChangesAsync().

What Ive:

  • Checked that the DbContext is correctly initialized and used in the method.
  • Added logs to track the changes detected by the ChangeTracker.
  • Tried forcing SaveChanges() after each modification — the issue persists.

Questions:

  1. Are there any aspects of updating related entities (e.g., Modelle and Farben) that I might be missing in my UpdateAsync method?

Thanks in advance for your help!

public async Task UpdateAsync(Hersteller hersteller){    var existingHersteller = await _context.Hersteller        .Include(h => h.Modelle)            .ThenInclude(m => m.Farben)        .FirstOrDefaultAsync(h => h.Id == hersteller.Id);    if (existingHersteller != null)    {        existingHersteller.Name = hersteller.Name;        foreach (var modell in hersteller.Modelle)        {            var existingModell = existingHersteller.Modelle                .FirstOrDefault(m => m.Id == modell.Id);            if (existingModell != null)            {                existingModell.Name = modell.Name;                foreach (var farbe in modell.Farben)                {                    var existingFarbe = existingModell.Farben                        .FirstOrDefault(f => f.Id == farbe.Id);                    if (existingFarbe != null)                    {                        existingFarbe.ColorName = farbe.ColorName;                        existingFarbe.Preis = farbe.Preis;                    }                }            }        }        await _context.SaveChangesAsync();    }}@page "/update/{id:int}"@using Autohaus.Components.Models@inject IHerstellerRepository HerstellerRepository@inject IModellRepository ModellRepository@inject IFarbeRepository FarbeRepository@inject NavigationManager NavigationManager<h3>Hersteller aktualisieren</h3>@if (formModel == null){<p><em>Chargement...</em></p>}else{<EditForm Enhance="true" method="post" Model="formModel" OnValidSubmit="HandleValidSubmit" FormName="updateHerstellerForm"><DataAnnotationsValidator /><ValidationSummary /><div class="mb-3"><label for="hersteller" class="form-label">Name des Herstellers</label><InputText id="hersteller" class="form-control" @bind-Value="formModel.HerstellerName" /><ValidationMessage For="@(() => formModel.HerstellerName)" /></div><div class="mb-3"><label for="modell" class="form-label">Modelle</label><InputText id="modell" class="form-control" @bind-Value="formModel.ModellName" /><ValidationMessage For="@(() => formModel.ModellName)" /></div><div class="mb-3"><label for="farbe" class="form-label">Farbe</label><InputText id="farbe" class="form-control" @bind-Value="formModel.FarbeName" /><ValidationMessage For="@(() => formModel.FarbeName)" /></div><div class="mb-3"><label for="preis" class="form-label">Preis</label><InputNumber id="preis" class="form-control" @bind-Value="formModel.Preis" /><ValidationMessage For="@(() => formModel.Preis)" /></div><button type="submit" class="btn btn-primary">Aktualisieren</button><button class="btn btn-secondary" @onclick="Cancel">Abbrechen</button></EditForm>}@code {    // Paramètre 'id' passé dans l'URL pour identifier le fabricant à mettre à jour    [Parameter]    public int id { get; set; }    private HerstellerFormModel? formModel;  // Le modèle contenant les données à afficher et àéditer    // Méthode qui est exécutée lors de l'initialisation de la page    protected override async Task OnInitializedAsync()    {        // Récupération du fabricant à partir de son ID        var hersteller = await HerstellerRepository.GetByIdAsync(id);        if (hersteller == null)  // Si le fabricant n'existe pas, redirection vers la page d'accueil        {            NavigationManager.NavigateTo("/");            return;        }        // Récupération du premier modèle et de la première couleur associée        var firstModell = hersteller.Modelle?.FirstOrDefault();        var firstFarbe = firstModell?.Farben?.FirstOrDefault();        // Initialisation du modèle de formulaire avec les données récupérées        formModel = new HerstellerFormModel            {                HerstellerName = hersteller.Name,                ModellName = firstModell?.Name ?? "",  // Si aucun modèle, chaîne vide                FarbeName = firstFarbe?.ColorName ?? "",  // Si aucune couleur, chaîne vide                Preis = firstFarbe?.Preis ?? 0  // Si aucune couleur, prix égal à 0            };    }    // Méthode exécutée lors de la soumission du formulaire si les données sont valides    private async Task HandleValidSubmit()    {        if (formModel == null) return;        // Récupérer le fabricant existant        var existingHersteller = await HerstellerRepository.GetByIdAsync(id);        if (existingHersteller == null)             return;        // Récupérer ou créer le modèle        var existingModell = existingHersteller.Modelle?.FirstOrDefault();        if (existingModell == null)        {            existingModell = new Modell { Name = formModel.ModellName };            existingHersteller.Modelle.Add(existingModell);        }        else        {            existingModell.Name = formModel.ModellName;        }        // Récupérer ou créer la couleur        var existingFarbe = existingModell?.Farben?.FirstOrDefault();        if (existingFarbe == null)        {            existingFarbe = new Farbe                {                    ColorName = formModel.FarbeName,                    Preis = formModel.Preis                };            existingModell.Farben.Add(existingFarbe);        }        else        {            existingFarbe.ColorName = formModel.FarbeName;            existingFarbe.Preis = formModel.Preis;        }        // Mise à jour du fabricant        existingHersteller.Name = formModel.HerstellerName;        // Enregistrer les modifications dans les repositories        await HerstellerRepository.UpdateAsync(existingHersteller);        await ModellRepository.UpdateAsync(existingModell);        await FarbeRepository.UpdateAsync(existingFarbe);        // Redirection après la mise à jour        NavigationManager.NavigateTo("/");    }    // Méthode pour annuler et revenir à la page d'accueil sans effectuer de modifications    private void Cancel()    {        NavigationManager.NavigateTo("/");  // Retour à la page d'accueil    }}using System.ComponentModel.DataAnnotations;namespace Autohaus.Components.Models{    public class HerstellerFormModel    {        // Hersteller        [Required(ErrorMessage = "Bitte geben Sie den Herstellernamen an")]        public string HerstellerName { get; set; }        // Modell        [Required(ErrorMessage = "Bitte geben Sie den Modellnamen an")]        public string ModellName { get; set; }        // Farbe        [Required(ErrorMessage = "Bitte geben Sie die Farbe an")]        public string FarbeName { get; set; }         [Required(ErrorMessage = "Bitte geben Sie den Preis an")]        [Range(0.01, double.MaxValue, ErrorMessage = "Der Preis muss positiv sein.")]        public decimal Preis { get; set; }        public string Kundenname { get; set; }         public string Verkaeufername { get; set; }    }}

Viewing all articles
Browse latest Browse all 4839

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>