调用DbContext.Entry时出现NullReferenceException异常

3
我遇到了一个奇怪的问题,有时候当我尝试使用以下代码重新加载一个 Entry 时,会出现以下情况:
DbEntityEntry<BatchServer> ent = d.Entry(jobServer);
//the ex is thrown at d.Entry
ent.Reload();

EF抛出一个NullReferenceException异常。但是,jobServerd(我的上下文变量)都不是空的,如果我们查看堆栈跟踪:

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内部存在异常。这个bug是100%可重现的,但只有在程序中进行大量工作之后才会出现。那么这是EF已知的bug还是我做错了什么?
问候
更新:
在调用此功能之前,我从上下文中获取了所有服务器:
    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不再存在于数据库中了? - tofutim
d 是什么?你设置了吗? - Rob
δΫ†γö³DbContextφ‰·BatchRemotingContextηΩ‰φ‰·εÖΕδΜ•γ±ΜοΦü - Grundy
你尝试设置断点并查看 djobServer 的值了吗? - Grundy
我已经做到了。这是一个有效的对象,例如不为null。在 d.BatchServers.ToList() 之前的调用运行良好。它会返回来自数据库中所有项目的列表。 - Venson
显示剩余2条评论
1个回答

0

好的,原因很奇怪,就像这个 bug 本身一样。

还有一个名为:ServerBatch 的实体,当我第一次添加它们时,一切都正常。然后我编辑它们并将它们第二次添加到我的实体列表中。之后,SaveChanges 崩溃了,因为我试图将具有 PK 的实体添加到已经存在 PK 的列表中。这个崩溃被处理了,所以程序会继续运行,紧接着这个崩溃,Entry 方法将失败并产生异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接