Мы иногда видим это исключение в наших журналах, но не можем понять, как воспроизвести его при тестировании:
System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта.
в System.Data.Objects.EntityEntry.DetectChangesInProperty (порядковый номер Int32, логическое DetectionOnlyComplexProperties, логическое обнаружение только).
в System.Data.Objects.EntityEntry..DetectChangesInScalarAndComplexProperties (IList 1 entries)<br>
at System.Data.Objects.ObjectStateManager.DetectChanges()<br>
at System.Data.Entity.Internal.InternalContext.DetectChanges(Boolean force)<br>
at System.Data.Entity.Internal.Linq.InternalSet
1.Find (Object [] keyValues)
at
Сбой метода System.Data.Objects.EntityEntry.DetectChangesInProperty(Int32 ordinal, Boolean detectOnlyComplexProperties, Boolean detectOnly)
декомпилируется с dotPeek (плюс мои комментарии) в:
private bool DetectChangesInProperty(
int ordinal,
bool detectOnlyComplexProperties,
bool detectOnly)
{
bool changeDetected = false;
// possible System.NullReferenceException on _cacheTypeMetadata
StateManagerMemberMetadata managerMemberMetadata = this._cacheTypeMetadata.Member(ordinal);
// possible System.NullReferenceException on managerMemberMetadata (if a null entry exists in _members[])
object obj1 = managerMemberMetadata.GetValue(this._wrappedEntity.Entity);
if (managerMemberMetadata.IsComplex)
{
if (this.State != EntityState.Deleted)
{
object complexObjectSnapshot = this.GetComplexObjectSnapshot(this.Entity, ordinal);
if (this.DetectChangesInComplexType(managerMemberMetadata, managerMemberMetadata, obj1, complexObjectSnapshot, ref changeDetected, detectOnly))
{
this.CheckForDuplicateComplexObjects(obj1);
if (!detectOnly)
{
((IEntityChangeTracker) this).EntityMemberChanging(managerMemberMetadata.CLayerName);
// possible System.NullReferenceException on _cache
this._cache.ChangingOldValue = complexObjectSnapshot;
((IEntityChangeTracker) this).EntityMemberChanged(managerMemberMetadata.CLayerName);
}
this.UpdateComplexObjectSnapshot(managerMemberMetadata, this.Entity, ordinal, obj1);
if (!changeDetected)
this.DetectChangesInComplexType(managerMemberMetadata, managerMemberMetadata, obj1, complexObjectSnapshot, ref changeDetected, detectOnly);
}
}
}
else if (!detectOnlyComplexProperties)
{
object obj2;
// possible System.NullReferenceException on _wrappedEntity
this.FindOriginalValue(managerMemberMetadata, this._wrappedEntity.Entity, out obj2);
object originalValue = ((StateManagerValue) obj2).originalValue;
// possible System.NullReferenceException on object
if (!object.Equals(obj1, originalValue))
{
changeDetected = true;
if (managerMemberMetadata.IsPartOfKey)
{
// static so no possible System.NullReferenceException
if (!ByValueEqualityComparer.Default.Equals(obj1, originalValue))
throw EntityUtil.CannotModifyKeyProperty(managerMemberMetadata.CLayerName);
}
else if (this.State != EntityState.Deleted && !detectOnly)
{
((IEntityChangeTracker) this).EntityMemberChanging(managerMemberMetadata.CLayerName);
((IEntityChangeTracker) this).EntityMemberChanged(managerMemberMetadata.CLayerName);
}
}
}
return changeDetected;
}
Есть несколько мест, где можно бросить NullReferenceException
, и я не могу начать догадываться. Если бы мы знали, как надежно воспроизвести проблему, я мог бы пройти, но я не знаю. Пока что этовсе, что у меня естьТип DbContext.Мы еще не реализовали экземпляр-на-запрос , но мы знаем, что должны.Это займет у нас несколько недель.Мы думаем, что это является причиной исключения.В то же время у нас есть различные подходы к обновлению DbContext: для вызова метода (дорого), теперь его заменяют (менее дорогим, но вонючим) локаторами сервиса с небольшим количеством Autofac (все еще не экземпляр для запроса из-за того, что он несовместим).с нашей версией MVC плюс async
).
Мы хотим выяснить, как надежно воспроизвести эту ошибку, чтобы мы могли знать, что экземпляр на запрос фактически устранил проблему.Таким образом, основной вопрос заключается не в том, «как это исправить», а в том, «как мы это воспроизводим»?И чтобы ответить на это, мне любопытно, как на самом деле происходит это исключение.