예제 #1
0
        protected virtual Object CreateAndPopulate(JsonContext jsonContext)
        {
            var jObject = jsonContext.JObject;

            JToken refToken = null;

            if (jObject.TryGetValue("$ref", out refToken))
            {
                return(_refMap[refToken.Value <String>()]);
            }

            var objectType = jsonContext.ObjectType;
            var entityType = _metadataStore.GetEntityType(objectType);

            // an entity type
            jsonContext.StructuralType = entityType;
            var keyValues = entityType.KeyProperties
                            .Select(p => jObject[p.Name].ToObject(p.ClrType))
                            .ToArray();
            var entityKey = EntityKey.Create(entityType, keyValues);
            var entity    = _entityManager.FindEntityByKey(entityKey);

            if (entity == null)
            {
                entity = (IEntity)Activator.CreateInstance(objectType);
            }
            // must be called before populate
            UpdateRefMap(jObject, entity);
            _allEntities.Add(entity);
            return(PopulateEntity(jsonContext, entity));
        }
예제 #2
0
        private EntityKey ExtractEntityKey(EntityType entityType, JNode jn)
        {
            var keyValues = entityType.KeyProperties
                            .Select(p => jn.Get(p.Name, p.ClrType))
                            .ToArray();
            var entityKey = EntityKey.Create(entityType, keyValues);

            return(entityKey);
        }
예제 #3
0
        protected virtual Object CreateAndPopulate(JsonContext jsonContext)
        {
            var jObject = jsonContext.JObject;

            JToken refToken = null;

            if (jObject.TryGetValue("$ref", out refToken))
            {
                return(_refMap[refToken.Value <String>()]);
            }

            EntityType entityType;
            Type       objectType;
            JToken     typeToken = null;

            if (jObject.TryGetValue("$type", out typeToken))
            {
                var clrTypeName    = typeToken.Value <String>();
                var entityTypeName = StructuralType.ClrTypeNameToStructuralTypeName(clrTypeName);
                entityType = _metadataStore.GetEntityType(entityTypeName);
                objectType = entityType.ClrType;
                if (!jsonContext.ObjectType.IsAssignableFrom(objectType))
                {
                    throw new Exception("Unable to convert returned type: " + objectType.Name + " into type: " + jsonContext.ObjectType.Name);
                }
                jsonContext.ObjectType = objectType;
            }
            else
            {
                objectType = jsonContext.ObjectType;
                entityType = _metadataStore.GetEntityType(objectType);
            }

            // an entity type
            jsonContext.StructuralType = entityType;
            var keyValues = entityType.KeyProperties
                            .Select(p => jObject[p.Name].ToObject(p.ClrType))
                            .ToArray();
            var entityKey = EntityKey.Create(entityType, keyValues);
            var entity    = _entityManager.FindEntityByKey(entityKey);

            if (entity == null)
            {
                entity = (IEntity)Activator.CreateInstance(objectType);
            }
            // must be called before populate
            UpdateRefMap(jObject, entity);
            _allEntities.Add(entity);
            return(PopulateEntity(jsonContext, entity));
        }
예제 #4
0
        private ImportResult ImportEntities(JNode jn, ImportOptions importOptions)
        {
            importOptions = importOptions ?? ImportOptions.Default;
            if (importOptions.ShouldMergeMetadata)
            {
                var msNode = jn.GetJNode("metadataStore");
                if (msNode != null)
                {
                    MetadataStore.ImportMetadata(msNode);
                    var dsJn = jn.GetJNode("dataService");
                    if (dsJn != null)
                    {
                        DefaultDataService = new DataService(dsJn);
                    }
                    var qoJn = jn.GetJNode("queryOptions");
                    if (qoJn != null)
                    {
                        DefaultQueryOptions = new QueryOptions(qoJn);
                    }
                }
            }
            var entityGroupNodesMap = jn.GetJNodeArrayMap("entityGroupMap");
            // tempKeyMap will have a new values where collisions will occur
            var tempKeyMap = jn.GetJNodeArray("tempKeys").Select(jnEk => new EntityKey(jnEk)).ToDictionary(
                ek => ek,
                ek => this.FindEntityByKey(ek) == null ? ek : EntityKey.Create(ek.EntityType, KeyGenerator.GetNextTempId(ek.EntityType.KeyProperties.First()))
                );

            var mergeStrategy    = (importOptions.MergeStrategy ?? this.DefaultQueryOptions.MergeStrategy ?? QueryOptions.Default.MergeStrategy).Value;
            var importedEntities = new List <IEntity>();

            using (NewIsLoadingBlock()) {
                entityGroupNodesMap.ForEach(kvp => {
                    var entityTypeName = kvp.Key;
                    var entityNodes    = kvp.Value;
                    var entityType     = MetadataStore.GetEntityType(entityTypeName);
                    var entities       = ImportEntityGroup(entityNodes, entityType, tempKeyMap, mergeStrategy);
                    importedEntities.AddRange(entities);
                });
            }
            return(new ImportResult(importedEntities, tempKeyMap));
        }