public async ValueTask WriteOperationAsync(Stream stream, OeOperationMessage operation)
        {
            IODataResponseMessage responseMessage = new Infrastructure.OeInMemoryMessage(stream, operation.ContentType);

            using (var messageWriter = new ODataMessageWriter(responseMessage, _settings))
                await WriteEntityAsync(operation.EntitySet, operation.Entry, stream).ConfigureAwait(false);
        }
Esempio n. 2
0
        private async Task WriteOperation(ODataBatchWriter writer, OeOperationMessage operation)
        {
            ODataBatchOperationResponseMessage operationMessage = await writer.CreateOperationResponseMessageAsync(operation.ContentId);

            operationMessage.SetHeader("Location", operation.RequestUrl.AbsoluteUri);
            operationMessage.SetHeader(ODataConstants.ContentTypeHeader, operation.ContentType);
            operationMessage.StatusCode = (int)operation.StatusCode;

            if (operation.StatusCode != HttpStatusCode.NoContent)
            {
                using (Stream stream = await operationMessage.GetStreamAsync())
                    await WriteEntity(operation.EntitySet, operation.Entry, stream);
            }
        }
Esempio n. 3
0
        private void WriteOperation(ODataBatchWriter writer, OeOperationMessage operation)
        {
            ODataBatchOperationResponseMessage operationMessage = writer.CreateOperationResponseMessage(operation.ContentId);

            operationMessage.SetHeader("Location", operation.RequestUrl.AbsoluteUri);
            operationMessage.SetHeader(ODataConstants.ContentTypeHeader, operation.ContentType);
            operationMessage.StatusCode = (int)operation.StatusCode;

            if (operation.StatusCode != HttpStatusCode.NoContent)
            {
                using (Stream stream = operationMessage.GetStream())
                    WriteEntity(stream, operation.EntityItem);
            }
        }
        private static async Task <OeBatchFilterAttributeAttribute.BatchModelStateDictionary> GetModelStateAsync(HttpContext httpContext)
        {
            IEdmModel          edmModel   = httpContext.GetEdmModel();
            Uri                baseUri    = UriHelper.GetBaseUri(httpContext.Request);
            Uri                requestUri = UriHelper.GetUri(httpContext.Request);
            OeOperationMessage operation  = await OeBatchMessage.CreateOperationMessageAsync(edmModel, baseUri, requestUri,
                                                                                             httpContext.Request.Body, httpContext.Request.ContentType, httpContext.Request.Method, OeParser.ServiceProvider).ConfigureAwait(false);

            IEdmModel          refModel         = edmModel.GetEdmModel(operation.EntitySet.Container);
            OeDataAdapter      dataAdapter      = refModel.GetDataAdapter(operation.EntitySet.Container);
            Object             dataContext      = dataAdapter.CreateDataContext();
            OeEntitySetAdapter entitySetAdapter = refModel.GetEntitySetAdapter(operation.EntitySet);
            Object             entity           = OeDataContext.CreateEntity(operation, entitySetAdapter.EntityType);

            var oeDataContext = new OeDataContext(entitySetAdapter, refModel, dataContext, operation);

            return(new OeBatchFilterAttributeAttribute.BatchModelStateDictionary(dataAdapter, oeDataContext, entity));
        }
        internal static Object CreateEntity(OeOperationMessage operation, Type clrEntityType)
        {
            if (operation.Method == ODataConstants.MethodPatch)
            {
                var properties = new Dictionary <String, Object>();
                foreach (ODataProperty odataProperty in operation.Entry.Properties)
                {
                    PropertyInfo?propertyInfo = clrEntityType.GetProperty(odataProperty.Name);
                    if (propertyInfo == null)
                    {
                        throw new InvalidOperationException("Not found property " + odataProperty.Name + " in type " + clrEntityType.FullName);
                    }

                    properties[odataProperty.Name] = OeEdmClrHelper.GetClrValue(propertyInfo.PropertyType, odataProperty.Value);
                }
                return(properties);
            }

            return(OeEdmClrHelper.CreateEntity(clrEntityType, operation.Entry));
        }
Esempio n. 6
0
        public void OnActionExecuted(ActionExecutedContext context)
        {
            if (!(context.ModelState is BatchModelStateDictionary) && _asyncLocal.Value is BatchModelStateDictionary modelState)
            {
                //single operation
                _asyncLocal.Value = new ModelStateDictionary();
                Db.OeDataAdapter   dataAdapter = modelState.DataAdapter;
                Object             dataContext = modelState.DataContext.DbContext;
                OeOperationMessage operation   = modelState.DataContext.Operation;
                try
                {
                    dataAdapter.SaveChangesAsync(dataContext, CancellationToken.None).GetAwaiter().GetResult();
                    dataAdapter.EntitySetAdapters.Find(operation.EntitySet).UpdateEntityAfterSave(dataContext, operation.Entry);

                    context.HttpContext.Response.ContentType = context.HttpContext.Request.ContentType;
                    var batchWriter = new Writers.OeBatchWriter(modelState.DataContext.EdmModel, UriHelper.GetBaseUri(context.HttpContext.Request));
                    batchWriter.WriteOperationAsync(context.HttpContext.Response.Body, operation).GetAwaiter().GetResult();
                }
                finally
                {
                    dataAdapter.CloseDataContext(dataContext);
                }
            }
        }
 public OeDataContext(ref OeEntitySetAdapter entitySetAdapter, Object dataContext, OeOperationMessage operation)
 {
     _entitySetAdapter = entitySetAdapter;
     _dataContext      = dataContext;
     _operation        = operation;
 }