From e4c73c5bbd01219e54a06de4d04c25b51c5c6743 Mon Sep 17 00:00:00 2001 From: mikepizzo Date: Wed, 5 Oct 2022 12:12:52 -0700 Subject: [PATCH] Support deserializing top-level collections of entity types. Enables PUT to an entity collection. --- .../ODataResourceSetDeserializer.cs | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.OData.Shared/Formatter/Deserialization/ODataResourceSetDeserializer.cs b/src/Microsoft.AspNet.OData.Shared/Formatter/Deserialization/ODataResourceSetDeserializer.cs index 9046973992..c7372de8d9 100644 --- a/src/Microsoft.AspNet.OData.Shared/Formatter/Deserialization/ODataResourceSetDeserializer.cs +++ b/src/Microsoft.AspNet.OData.Shared/Formatter/Deserialization/ODataResourceSetDeserializer.cs @@ -54,7 +54,19 @@ public override object Read(ODataMessageReader messageReader, Type type, ODataDe throw Error.Argument("edmType", SRResources.ArgumentMustBeOfType, EdmTypeKind.Complex + " or " + EdmTypeKind.Entity); } - ODataReader resourceSetReader = readContext.IsChangedObjectCollection ? messageReader.CreateODataDeltaResourceSetReader() : messageReader.CreateODataResourceSetReader(); + IEdmEntityType entityType = edmType.AsCollection().ElementType().Definition as IEdmEntityType; + IEdmEntitySet entitySet = null; + if(entityType != null) + { + // CreateODataDeltaResourceSetReader requires an entity set if you pass a type for reading a request. + // We can relax that check in ODataJsonlightInputContext, line 670. + // In the meantime, creating a dummy entity set allows the reader to know what type its reading so the payload + // doesn't have to be marked up with odata.type annotations. + IEdmEntityContainer container = new EdmEntityContainer(entityType.Namespace, ""); + entitySet = new EdmEntitySet(container,"",entityType); + } + + ODataReader resourceSetReader = readContext.IsChangedObjectCollection ? messageReader.CreateODataDeltaResourceSetReader() : messageReader.CreateODataResourceSetReader(entitySet, entityType); object resourceSet = resourceSetReader.ReadResourceOrResourceSet(); return ReadInline(resourceSet, edmType, readContext); } @@ -135,16 +147,28 @@ public sealed override object ReadInline(object item, IEdmTypeReference edmType, } } - if (result != null && elementType.IsComplex()) + if (result != null && (elementType.IsComplex() || elementType.IsEntity())) { if (readContext.IsUntyped) { - EdmComplexObjectCollection complexCollection = new EdmComplexObjectCollection(edmType.AsCollection()); - foreach (EdmComplexObject complexObject in result) + if (elementType.IsComplex()) + { + EdmComplexObjectCollection complexCollection = new EdmComplexObjectCollection(edmType.AsCollection()); + foreach (EdmComplexObject complexObject in result) + { + complexCollection.Add(complexObject); + } + return complexCollection; + } + else { - complexCollection.Add(complexObject); + EdmEntityObjectCollection entityCollection = new EdmEntityObjectCollection(edmType.AsCollection()); + foreach (EdmEntityObject entityObject in result) + { + entityCollection.Add(entityObject); + } + return entityCollection; } - return complexCollection; } else {