【问题标题】:NullReferenceException when calling DbContext.Entry调用 DbContext.Entry 时出现 NullReferenceException
【发布时间】:2023-03-15 06:33:02
【问题描述】:

我有时会遇到这种奇怪的行为,当我尝试重新加载条目时:

DbEntityEntry<BatchServer> ent = d.Entry(jobServer);
//the ex is thrown at d.Entry
ent.Reload();

EF 抛出 NullReferenceException 异常。但是jobServerd(我的上下文变量)都不是空的,如果我们看看 StackTrace:

System.NullReferenceException: Object reference not set to an instance of an object.
at System.Data.Objects.EntityEntry.DetectChangesInProperty(Int32 ordinal, Boolean detectOnlyComplexProperties, Boolean detectOnly)
at System.Data.Objects.EntityEntry.DetectChangesInProperties(Boolean detectOnlyComplexProperties)
at System.Data.Objects.ObjectStateManager.DetectChangesInScalarAndComplexProperties(IList`1 entries)
at System.Data.Objects.ObjectStateManager.DetectChanges()
at System.Data.Objects.ObjectContext.DetectChanges()
at System.Data.Entity.Internal.InternalContext.DetectChanges(Boolean force)
at System.Data.Entity.Internal.InternalContext.GetStateEntry(Object entity)
at System.Data.Entity.Internal.InternalEntityEntry..ctor(InternalContext internalContext, Object entity)
at System.Data.Entity.DbContext.Entry[TEntity](TEntity entity)
at IEADPC.BatchRemoting.Monitor.ViewModel.MonitorViewModel.<>c__DisplayClass40.<>c__DisplayClass42.<RefreshAll>b__3d(BatchRemotingContexA first chance exception of type 'System.NullReferenceException' occurred in IEADPC.BatchRemoting.Monitor.dll

我们看到 EF 内部存在异常。这个错误是 100% 可重现的,但只有在程序中进行了大量工作之后。如果 EF 或我做错了什么,这是一个已知的错误吗?

问候

更新:

就在我调用它之前,我从上下文中获取所有服务器:

    DataAccessObject.ClientDataAccess.WorkOnDatabase(d =>
    {
        var colzwei = new ObservableCollection<BatchServer>(d.BatchServers.ToList());
        foreach (var jobServer in colzwei)
        {
            DbEntityEntry<BatchServer> ent;                                 
            ent = d.Entry(jobServer);
            ent.Reload();
            ...
        }
    }

    public void WorkOnDatabase(Action<BatchRemotingContext> databaseAction)
    {
        if (DbContext == null)
        {
            using (DbContext = ReturnDatabase())
            {
                databaseAction.Invoke(DbContext);
            }
        }
        else
        {
            databaseAction.Invoke(DbContext);
        }
    }

这在整个程序中运行良好,只是当我在我的程序中工作时,有时会发生这种情况

【问题讨论】:

  • ent.Reload 是否发生异常? ent 是否为空?也许 jobServer 不再在数据库中?
  • 什么是d。你设置了吗?
  • @tofutim 没有例外发生在d.Entry(...)ent.Reload(); 未被执行。 @Robuust 我做到了。我正在使用一个确保我始终使用有效连接的功能。这适用于所有其他情况。
  • 您的DbContextBatchRemotingContext 还是其他类?
  • 它是BatchRemotingContext 类。整个解决方案中没有其他上下文

标签: c# entity-framework


【解决方案1】:

好吧,原因很奇怪,就像错误本身一样。

还有一个名为:ServerBatch 的实体,当我第一次添加它们时,一切正常。然后我编辑它们并第二次将它们添加到我的实体列表中。在那之后SaveChanges 崩溃,因为我尝试将带有 PK 的实体添加到 PK 已经存在的列表中。此崩溃已得到处理,因此程序将继续运行,并且在崩溃之后,Entry 方法将失败并产生该异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-05
    • 2018-03-25
    • 1970-01-01
    • 2012-06-25
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多