Question

I have entities which form a tree relationships.

class MyEntity
{
    public int Id {get;set;}

    public int ParentId {get;set;}
    public virtual MyEntity Parent {get;set;}

    public virtual ICollection<MyEntity> Children {get;set;}
}

When these entities are called without AsNoTracking() relationships are fixed up.

var entities = MyEntitiesSet.ToList();

All navigation properties and collections are set.
However if AsNoTracking() is called:

var entities = MyEntitiesSet.AsNoTracking.ToList();

no navigation property is set. This is understandable. But I cannot understand why collection and naviagtion properties are not overriden to provide relationship fixup for this code:

entity.Parent = anotherEntity;

Here I expect that anotherEntity.Children collection now contains entity. Alas, this is false expectation as my experimetns show.

Is it possible to get desired behavior without enabling change tracking?

Update 1

I loked at generated proxies and noted that overriden collections are hashsets of the proxy type. They are not backed up by EntityCollection<TEntity> what was true to EF 4 ObjectContext proxies.

And I've found the answer here.
DbContext does not generate proxies which fix up relationships.

Was it helpful?

Solution

DbContext does not generate proxies which fix up relationships.

Proof is here: http://connect.microsoft.com/VisualStudio/feedback/details/760609/poco-navigation-proxies-should-fixup-the-other-end-automatically

Yet, when entitties are attached to the context loading related entities:

context.ASet.ToList();
context.BSet.ToList();

sets relationships automatically.

OTHER TIPS

i arent sure how this has anything to do with tracking, however to get the relationship working you need to associate the collection navigation property with the key it is using. See here for an example.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top