Контекст Entity Framework не обновляется - PullRequest
1 голос
/ 22 сентября 2019

Доброе утро.Я использую Blazor 3 Preview 9. На самом деле я не могу обновить свой контекст без перезагрузки всей страницы с помощью F5.Я уже использую отдельные контексты.Если я удаляю строку с:

 using (var context = new PlutoneContext())
            {
                context.Azienda.Remove(azienda);
                await context.SaveChangesAsync();
            }

и позже, я перезагружаю данные с

 using (var context = new PlutoneContext())
            {
                var query = context.Azienda.AsNoTracking().ToList().Where(a =>
                                                            a.Codice.ContainsCaseInsensitive(_filtroCodice) &&
                                                            a.RagioneSociale.ContainsCaseInsensitive(_filtroRagioneSociale) &&
                                                            a.PartitaIva.ContainsCaseInsensitive(_filtroPartitaIva) &&
                                                            a.CodiceFiscale.ContainsCaseInsensitive(_filtroCodiceFiscale) &&
                                                            a.Telefono.ContainsCaseInsensitive(_filtroTelefono) &&
                                                            a.Email.ContainsCaseInsensitive(_filtroEmail)).ToList();

                if (_direzioneOrdinamento == DirezioneOrdinamento.Ascendente)
                    query = query.OrderBy(a => a.GetType().GetProperty(_colonnaOrdinamento).GetValue(a, null)).ToList();
                else
                    query = query.OrderByDescending(a => a.GetType().GetProperty(_colonnaOrdinamento).GetValue(a, null)).ToList();

                _numeroRighe = query.Count;
                _numeroPagine = query.Count() / 10;
                if (query.Count() % 10 != 0) _numeroPagine++;

                _aziende = query.Skip((_pagina - 1) * 10).Take(10).ToList();
            }

, удаленная строка все еще там.Но я уже избавляюсь и использую 2 контекста.А также я отключил кеширование с помощью AsNoTracking ().

Как это исправить?

Обновление 1

 protected override async Task OnInitializedAsync()
    {
        CaricaTabella();
    }

    private void CaricaTabella()
    {
        try
        {
            using (var context = new PlutoneContext())
            {
                var query = context.Azienda.AsNoTracking().ToList().Where(a => 
                                                            a.Codice.ContainsCaseInsensitive(_filtroCodice) &&
                                                            a.RagioneSociale.ContainsCaseInsensitive(_filtroRagioneSociale) &&
                                                            a.PartitaIva.ContainsCaseInsensitive(_filtroPartitaIva) &&
                                                            a.CodiceFiscale.ContainsCaseInsensitive(_filtroCodiceFiscale) &&
                                                            a.Telefono.ContainsCaseInsensitive(_filtroTelefono) &&
                                                            a.Email.ContainsCaseInsensitive(_filtroEmail)).ToList();

                if (_direzioneOrdinamento == DirezioneOrdinamento.Ascendente)
                    query = query.OrderBy(a => a.GetType().GetProperty(_colonnaOrdinamento).GetValue(a, null)).ToList();
                else
                    query = query.OrderByDescending(a => a.GetType().GetProperty(_colonnaOrdinamento).GetValue(a, null)).ToList();

                _numeroRighe = query.Count;
                _numeroPagine = query.Count() / 10;
                if (query.Count() % 10 != 0) _numeroPagine++;

                _aziende = query.Skip((_pagina - 1) * 10).Take(10).ToList();
            }
        }
        catch (Exception ex)
        {
            _caricamento = false;
        }

        _caricamento = false;
    }

    private void Ordina(string colonna)
    {
        if (_colonnaOrdinamento != colonna)
        {
            _colonnaOrdinamento = colonna;
            _direzioneOrdinamento = DirezioneOrdinamento.Ascendente;

            CaricaTabella();
        }
        else
        {
            if (_direzioneOrdinamento == DirezioneOrdinamento.Ascendente)
                _direzioneOrdinamento = DirezioneOrdinamento.Discendente;
            else
                _direzioneOrdinamento = DirezioneOrdinamento.Ascendente;

            CaricaTabella();
        }
    }

    private async void Cancella(Azienda azienda)
    {
        if (!(await JavaScriptInterop.MessageBoxConferma("Vuoi davvero cancellare l'azienda " + azienda.RagioneSociale + "?")))
            return;

        try
        {
            using (var context = new PlutoneContext())
            {
                context.Azienda.Remove(azienda);
                context.SaveChanges();
                StateHasChanged();
            }
        }
        catch (Exception ex)
        {
            await JavaScriptInterop.MessageBox("Si è verificato un errore durante la cancellazione dell'azienda");
            return;
        }

        CaricaTabella();
    }

Обновление 2

@foreach (var azienda in _aziende)
                    {
                        <tr>
                            <td>@azienda.Codice</td>
                            <td>@azienda.RagioneSociale</td>
                            <td>@azienda.PartitaIva</td>
                            <td>@azienda.CodiceFiscale</td>
                            <td>@azienda.Email</td>
                            <td>@azienda.Telefono</td>
                            <td>
                                <button class="btn btn-primary" @onclick="(() => Modifica(azienda))"><i class="fa fa-edit"></i></button>
                                <button class="btn btn-danger" @onclick="(() => Cancella(azienda))"><i class="fa fa-trash"></i></button>
                            </td>
                        </tr>
                    }

Обновление 3 Я сделал таким образом, но ничего не изменилось.

using (var context = new PlutoneContext())
            {
                var a = context.Azienda.Find(azienda.Codice);
                if (a != null)
                {
                    context.Azienda.Remove(a);
                    context.SaveChanges();
                }
                StateHasChanged();
            }

1 Ответ

0 голосов
/ 22 сентября 2019

Добрый день, сэр.Трудно сказать из этого контекста.Может быть здесь

            {
                context.Azienda.Remove(azienda);
                await context.SaveChangesAsync();
            }

azienda не отслеживается?Это также может быть метод с объявлением async void в приведенном выше вызове.

Для меня состояние использования похоже на запах кода.Вы можете использовать встроенный DI, который обрабатывает время жизни DbContext.

Кстати.во второй части вы загружаете все данные в память.context.Azienda.AsNoTracking().ToList() и после этого вы применяете фильтрацию к загруженному набору данных, а не к самому серверу SQL.В большом наборе данных это может в конечном итоге потреблять много памяти, а оценка запросов будет медленной.

...