private int UpdateEntryPropertiesAndAssociations( string collection, IDictionary<string, object> entryKey, IDictionary<string, object> entryData, EntryMembers entryMembers) { bool hasPropertiesToUpdate = entryMembers.Properties.Count > 0; bool merge = !hasPropertiesToUpdate || CheckMergeConditions(collection, entryKey, entryData); var commandText = GetFluentClient() .For(_schema.FindBaseTable(collection).ActualName) .Key(entryKey) .CommandText; var feedWriter = new ODataFeedWriter(); var table = _schema.FindConcreteTable(collection); var entryElement = feedWriter.CreateDataElement(_schema.TypesNamespace, table.EntityType.Name, entryMembers.Properties); var unlinkAssociationNames = new List<string>(); foreach (var associatedData in entryMembers.AssociationsByValue) { var association = table.FindAssociation(associatedData.Key); if (associatedData.Value != null) { CreateLinkElement(entryElement, collection, associatedData); } else { unlinkAssociationNames.Add(association.ActualName); } } var command = new HttpCommand(merge ? RestVerbs.MERGE : RestVerbs.PUT, commandText, entryData, entryElement.ToString()); _requestBuilder.AddCommandToRequest(command); var result = _requestRunner.UpdateEntry(command); foreach (var associatedData in entryMembers.AssociationsByContentId) { var linkCommand = CreateLinkCommand(collection, associatedData.Key, feedWriter.CreateLinkPath(command.ContentId), feedWriter.CreateLinkPath(associatedData.Value)); _requestBuilder.AddCommandToRequest(linkCommand); _requestRunner.UpdateEntry(linkCommand); } foreach (var associationName in unlinkAssociationNames) { UnlinkEntry(collection, entryKey, associationName); } return result; }
private HttpCommand CreateLinkCommand(string collection, string associationName, string entryPath, string linkPath) { var feedWriter = new ODataFeedWriter(); var linkEntry = feedWriter.CreateLinkElement(linkPath); var linkMethod = _schema.FindAssociation(collection, associationName).IsMultiple ? RestVerbs.POST : RestVerbs.PUT; var commandText = feedWriter.CreateLinkCommand(entryPath, associationName); return new HttpCommand(linkMethod, commandText, null, linkEntry.ToString(), true); }
private HttpCommand CreateUnlinkCommand(string collection, string associationName, string entryPath) { var commandText = new ODataFeedWriter().CreateLinkCommand(entryPath, associationName); return HttpCommand.Delete(commandText); }
public IDictionary<string, object> InsertEntry(string collection, IDictionary<string, object> entryData, bool resultRequired = true) { RemoveSystemProperties(entryData); var table = _schema.FindConcreteTable(collection); var entryMembers = ParseEntryMembers(table, entryData); var feedWriter = new ODataFeedWriter(); var entry = feedWriter.CreateDataElement(_schema.TypesNamespace, table.ActualName, entryMembers.Properties); foreach (var associatedData in entryMembers.AssociationsByValue) { CreateLinkElement(entry, collection, associatedData); } var commandText = _schema.FindBaseTable(collection).ActualName; var command = HttpCommand.Post(commandText, entryData, entry.ToString()); _requestBuilder.AddCommandToRequest(command); var result = _requestRunner.InsertEntry(command, resultRequired); foreach (var associatedData in entryMembers.AssociationsByContentId) { var linkCommand = CreateLinkCommand(collection, associatedData.Key, feedWriter.CreateLinkPath(command.ContentId), feedWriter.CreateLinkPath(associatedData.Value)); _requestBuilder.AddCommandToRequest(linkCommand); _requestRunner.InsertEntry(linkCommand, resultRequired); } return result; }