EntityFramework中的定期NullReferenceExceptions,永远不应该

时间:2018-04-04 14:28:17

标签: c# entity-framework-6

每隔一段时间,也许每月几天,我们的内部业务线应用程序的实体框架经常出现错误。这些错误主要是我们代码中的NullReferenceException。这些错误经常发生一天左右,然后消失几周左右。我们发现重启IIS可以让它们一直消失到下一次。它们不会发生在每个请求上,而是一个非平凡的数字。这种错误我们很少见到一段时间,然后会在一天中看到一堆。我无法将时间与服务器上发生的任何事情相关联 - 用户活动或服务器本身。

对DbContext 的所有引用都应该正确地包含在Using语句中。

错误通常似乎是在调用类似

的内容
var firstEntitiy = context.EntityA.Where(e => e.Id == itemId).Single();
var foreignName = firstEntity.EntityB.Name;

return foreignName;

错误似乎是在调用EntityB.Name时。我知道EntityA有一个记录。并且它具有EntityB的不可为空的外键,因此不知道EntityB如何为空。

除了标准的NullReferenceException错误外,我们有时也会在同一时间段内收到EntityFramework.dll.ValidateRowsAffected或EntityFramework.dll.GetOtherEndOfRelationship错误。

这是我们已经处理了一段时间的事情。我只在生产中见过它,所以对诊断或调试的访问权限有限。

实体框架6.1.3 .Net 4.5.2。 Sql Server 2012. Windows Server 2008

编辑:通常堆栈跟踪没有帮助。有时我们会在框架本身中遇到异常。

Type : System.NullReferenceException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Object reference not set to an instance of an object.
Source : EntityFramework
Data : System.Collections.ListDictionaryInternal
TargetSite : System.Data.Entity.Core.Objects.DataClasses.RelatedEnd GetOtherEndOfRelationship(System.Data.Entity.Core.Objects.Internal.IEntityWrapper)
HResult : -2147467261
Stack Trace : at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.GetOtherEndOfRelationship(IEntityWrapper wrappedEntity)
at System.Data.Entity.Core.Objects.EntityEntry.AddRelationshipDetectedByForeignKey(Dictionary`2 relationships, Dictionary`2 principalRelationships, EntityKey relatedKey, EntityEntry relatedEntry, RelatedEnd relatedEndFrom)
at System.Data.Entity.Core.Objects.EntityEntry.DetectChangesInForeignKeys()
at System.Data.Entity.Core.Objects.ObjectStateManager.DetectChangesInForeignKeys(IList`1 entries)
at System.Data.Entity.Core.Objects.ObjectStateManager.DetectChanges()
at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
at System.Data.Entity.DbSet`1.Add(TEntity entity)

0 个答案:

没有答案