public object InsertChild(string entityName, string id, string childName, object entity) { // TODO: refactor var entityType = _entityResolver.Resolve(entityName); var repo = _entityResolver.GetRepository(entityType); var childType = _entityResolver.ResolveChild(entityType, childName); var json = JsonConvert.SerializeObject(entity); var childEntity = JsonConvert.DeserializeObject(json, childType); childType.GetProperty("Id").SetValue(childEntity, ObjectId.GenerateNewId().ToString()); var item = repo.Get(id); var childFieldName = $"{childName[0].ToString().ToUpperInvariant()}{childName.Substring(1).ToLowerInvariant()}"; var childField = entityType.GetProperty(childFieldName); var children = childField.GetValue(item); children.GetType().GetMethod("Add").Invoke(children, new[] { childEntity }); repo.Update(id, item); return(childEntity); }