/// <summary> /// Builds a <see cref="ResourceIdentifierObject"/> for a HasOne relationship. /// </summary> private ResourceIdentifierObject GetRelatedResourceLinkageForHasOne(HasOneAttribute relationship, IIdentifiable resource) { var relatedResource = (IIdentifiable)relationship.GetValue(resource); if (relatedResource != null) { return(GetResourceIdentifier(relatedResource)); } return(null); }
private object SetHasOneRelationship(object entity, PropertyInfo[] entityProperties, HasOneAttribute attr, ContextEntity contextEntity, Dictionary <string, RelationshipData> relationships, List <ResourceObject> included = null, List <string> includePaths = null) { var relationshipName = attr.PublicRelationshipName; if (relationships.TryGetValue(relationshipName, out RelationshipData relationshipData) == false) { return(entity); } var rio = (ResourceIdentifierObject)relationshipData.ExposedData; var foreignKey = attr.IdentifiablePropertyName; var foreignKeyProperty = entityProperties.FirstOrDefault(p => p.Name == foreignKey); if (foreignKeyProperty == null && rio == null) { return(entity); } SetHasOneForeignKeyValue(entity, attr, foreignKeyProperty, rio); SetHasOneNavigationPropertyValue(entity, attr, rio, included); // recursive call ... if (included != null) { var navigationPropertyValue = attr.GetValue(entity); var resourceGraphEntity = _jsonApiContext.ResourceGraph.GetContextEntity(attr.DependentType); if (navigationPropertyValue != null && resourceGraphEntity != null) { var includedResource = included.SingleOrDefault(r => r.Type == rio.Type && r.Id == rio.Id); if (includedResource != null) { var paths = includePaths?.Select(x => { var tmp = x.Split('.').ToList(); tmp.RemoveAt(0); return(string.Join(".", tmp)); }).ToList(); SetRelationships(navigationPropertyValue, resourceGraphEntity, includedResource.Relationships, included, paths); } } } return(entity); }
/// <summary> /// Builds a <see cref="ResourceIdentifierObject"/> for a HasOne relationship /// </summary> private ResourceIdentifierObject GetRelatedResourceLinkage(HasOneAttribute relationship, IIdentifiable entity) { var relatedEntity = (IIdentifiable)relationship.GetValue(entity); if (relatedEntity == null && IsRequiredToOneRelationship(relationship, entity)) { throw new NotSupportedException("Cannot serialize a required to one relationship that is not populated but was included in the set of relationships to be serialized."); } if (relatedEntity != null) { return(GetResourceIdentifier(relatedEntity)); } return(null); }
private object SetHasOneRelationship(object entity, PropertyInfo[] entityProperties, HasOneAttribute attr, ContextEntity contextEntity, Dictionary <string, RelationshipData> relationships, List <ResourceObject> included = null) { var relationshipName = attr.PublicRelationshipName; if (relationships.TryGetValue(relationshipName, out RelationshipData relationshipData) == false) { return(entity); } var rio = (ResourceIdentifierObject)relationshipData.ExposedData; var foreignKey = attr.IdentifiablePropertyName; var foreignKeyProperty = entityProperties.FirstOrDefault(p => p.Name == foreignKey); if (foreignKeyProperty == null && rio == null) { return(entity); } SetHasOneForeignKeyValue(entity, attr, foreignKeyProperty, rio); SetHasOneNavigationPropertyValue(entity, attr, rio, included); // recursive call ... if (included != null) { var navigationPropertyValue = attr.GetValue(entity); var contextGraphEntity = _jsonApiContext.ContextGraph.GetContextEntity(attr.Type); if (navigationPropertyValue != null && contextGraphEntity != null) { var includedResource = included.SingleOrDefault(r => r.Type == rio.Type && r.Id == rio.Id); if (includedResource != null) { SetRelationships(navigationPropertyValue, contextGraphEntity, includedResource.Relationships, included); } } } return(entity); }