The way we materialize json entities is different than regular/non-json owned entities. For json we prune the entire include tree and materialize related json entities as part of it's parent entity materialization (recursively). This may lead to a problem in tracking query. We query for entity with nested json structure, it gets properly materialized and stored in change tracker. Then we modify the nested json entity (e.g. add element to nested json collection) and re-query. In the materializer we try to get entity from change tracker - we find it and return it. However that short-circuits materializing of the nested owned json entities and therefore we don't see the updates.
In regular queries we preserve the entire IncludeExpression structure (rather than prune it), so we go through materialization of all the entities, regardless if we find some of them in the change tracker or not.
To fix this we should rewrite the json entity materializer logic for successfully finding entity entry for the given key - instead of simply returning the entity from the entry, we need to also generate code to build all the navigations like we do for NoTracking/first query.
In case of utf8jsonreader we can use the "simplified" pattern (like we could use for entities with parameterless ctors) - we already have the entity instance, so don't need to cache all the navigations and can do the fixup between parent and children in place.