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)); }
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); }
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)); }
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)); }