【问题标题】:Entity Framework context not refreshing实体框架上下文不刷新
【发布时间】:2019-09-22 09:15:05
【问题描述】:

早上好。我正在使用 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();
            }

【问题讨论】:

  • "然后我重新加载数据" - 多久之后?看看你如何在这里调用这些异步方法会有所帮助。
  • 作为诊断,`int n = await context.SaveChangesAsync();` 并验证 n == 1
  • @HenkHolterman 在执行删除命令后立即执行。该行被删除,因为当我重新加载窗口时,删除的行丢失了。
  • 显示“紧接着”的代码。这闻起来像是一个异步问题。
  • 上传完整代码:-)

标签: c# asp.net frameworks entity blazor


【解决方案1】:

先生,您好。很难从这种情况下判断。 也许在这里

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

azienda 未被跟踪?这也可以是上面调用中带有async void 声明的方法。

对我来说,使用状态就像是代码味道。您可以使用处理 DbContext 生命周期的(内置)DI。

顺便说一句。在第二部分中,您将每个数据加载到内存中。 context.Azienda.AsNoTracking().ToList() 之后,您将在加载的数据集上应用过滤,而不是在它自身的 SQL 服务器上应用过滤。在大型数据集中,这最终可能会占用大量内存,并且查询评估会很慢。

【讨论】:

  • 我正在检查对象是否被跟踪。关于性能,是的,我知道客户端执行可能会导致缓慢。但是如果我不这样做,我会在运行时收到一个异常,说“无法翻译 LINQ 表达式。要么以可翻译的形式重写查询,要么通过插入对 AsEnumerable 的调用显式切换到客户端评估()、AsAsyncEnumerable()、ToList() 或 ToListAsync()"
  • 关注这个问题,你如何告诉 UI(blazor 组件)发生了一些变化?也许你搞砸了双向绑定或组件中的简单调用 StateHasChanged() 就足够了
  • 刚试过StateHasChanged(),不行。但是,在第二次删除后,第一行消失了,第二行我也遇到了同样的问题:-D
猜你喜欢
  • 2016-11-11
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多