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