Robert
Robert

Reputation: 4406

NullReferenceException when nothing is null?

I am testing (integration) my repository layer and I keep getting a null reference error from EF. My concern is, There is nothing in the object null when I run the debugger. In fact there is nothing in the entire method that is null. All of the properties are set up properly in Automapper and I am using real (not mocked) values for everything. They are all there and use the real version of the code.

Test:

[Test]
public void Clone_ShouldCloneUser()
{
    using (var scope = new TransactionScope())
    {
        //arrange
        var request = Builder<CloneUserRequest>.CreateNew()
            .With(x => x.KeyToClone = 29)
            .With(x => x.User = Builder<User>.CreateNew().With(y => y.Key = 0)
                .Build())
            .Build();

        //act
        _sut.Clone(request);

        //assert
        Assert.DoesNotThrow(() => _sut.Clone(request));
    }
}

Method:

public void Clone(CloneUserRequest request)
{
    var usersGroupsToBeCloned = _context.WebUserGroups.Where(x => x.UserKey == request.KeyToClone).ToList();
    var webUser = _mappingService.Map(request.User, new WebUser());
    webUser.WebUserGroups = usersGroupsToBeCloned;
    //On this line I receive a NullReferenceException, but nothing is null
    _context.WebUsers.Add(webUser);
    _context.SaveChanges();
}

Stack Trace:

System.NullReferenceException : Object reference not set to an instance of an object.
at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.MarkForeignKeyPropertiesModified()
at System.Data.Entity.Core.Objects.DataClasses.EntityReference.AddToNavigationPropertyIfCompatible(RelatedEnd otherRelatedEnd)
at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Entity.Core.Objects.DataClasses.EntityCollection`1.Include(Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Entity.Core.Objects.DataClasses.RelationshipManager.AddRelatedEntitiesToObjectStateManager(Boolean doAttach)
at System.Data.Entity.Core.Objects.ObjectContext.AddObject(String entitySetName, Object entity)
at System.Data.Entity.Internal.Linq.InternalSet`1.<>c__DisplayClassd.<Add>b__c()
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)
at Repositories.UserRepository.Clone(CloneUserRequest request) in UserRepository.cs: line 39
at Repositories.UserRepositoryIntegrationTests.Clone_ShouldCloneUser() in UserRepositoryIntegrationTests.cs: line 50

Is there something obvious that I am missing or a bug in EF perhaps?

Upvotes: 2

Views: 1585

Answers (1)

Robert
Robert

Reputation: 4406

I figured out what was wrong. Our DB structure is terrible and there is actually a circular reference between WebUserGroup (it has a child WebUser) and WebUser(It has collection of WebUserGroups). So when I got all of the UserGroups to clone for the user, It had a reference to the user that I was initially cloning. Somehow EF decided to send me a nullReferenceException. When I changed the WebUser Property on the Groups to the new one it works great. Now its time to talk to my DBA's about updating this...

Upvotes: 5

Related Questions