Exemple #1
0
 public void Configure()
 {
     if (_ctx.ResolveName == null)
     {
         _ctx.ResolveName = t => t.FullName;
     }
     _ctx.Format.LoadServiceModel = () =>
     {
         Uri metadataUri = _ctx.GetMetadataUri();
         if (!models.ContainsKey(metadataUri))
         {
             var       xmlTextReader       = new XmlTextReader(metadataUri.ToString());
             IEdmModel edmModel            = null;
             IEnumerable <EdmError> errors = null;
             if (CsdlReader.TryParse(xmlTextReader, out edmModel, out errors))
             {
                 models[metadataUri] = edmModel;
             }
             else
             {
                 var errorMessageBuilder = new StringBuilder("Model creation failed; please resolve the following errors in the metadata document:");
                 foreach (EdmError error in errors)
                 {
                     errorMessageBuilder.AppendLine(String.Format("t{0}", error.ErrorMessage));
                 }
                 throw new Exception(errorMessageBuilder.ToString());
             }
         }
         return(models[metadataUri]);
     };
     _ctx.Format.UseJson();
     _ctx.SendingRequest2 += ChangeAcceptHeader;
 }
        public EdmDataModelProvider(Uri serviceUri, bool isReadonly, bool supportPagingAndSorting)
        {
            var context = new DataServiceContext(serviceUri);
            Uri metadataUri = context.GetMetadataUri();
            var doc = XDocument.Load(metadataUri.AbsoluteUri);

            var itemCollection = new EdmItemCollection(GetSchemas(doc).Select(s => s.CreateReader()));

            RelationshipEndLookup = new Dictionary<long, EdmColumnProvider>();
            TableEndLookup = new Dictionary<EntityType, EdmTableProvider>();

            var tables = new List<TableProvider>();

            // Create a dictionary from entity type to entity set. The entity type should be at the root of any inheritance chain.
            IDictionary<EntityType, EntitySet> entitySetLookup = itemCollection.GetItems<EntityContainer>().SelectMany(c => c.BaseEntitySets.OfType<EntitySet>()).ToDictionary(e => e.ElementType);

            // Create a lookup from parent entity to entity
            ILookup<EntityType, EntityType> derivedTypesLookup = itemCollection.GetItems<EntityType>().ToLookup(e => (EntityType)e.BaseType);

            _complexTypes = itemCollection.GetItems<ComplexType>();

            // Keeps track of the current entity set being processed
            EntitySet currentEntitySet = null;

            // Do a DFS to get the inheritance hierarchy in order
            // i.e. Consider the hierarchy
            // null -> Person
            // Person -> Employee, Contact
            // Employee -> SalesPerson, Programmer
            // We'll walk the children in a depth first order -> Person, Employee, SalesPerson, Programmer, Contact.
            var objectStack = new Stack<EntityType>();
            // Start will null (the root of the hierarchy)
            objectStack.Push(null);
            while (objectStack.Any()) {
                EntityType entityType = objectStack.Pop();
                if (entityType != null) {
                    // Update the entity set when we are at another root type (a type without a base type).
                    if (entityType.BaseType == null) {
                        currentEntitySet = entitySetLookup[entityType];
                    }

                    var table = CreateTableProvider(currentEntitySet, entityType, isReadonly, supportPagingAndSorting);
                    tables.Add(table);
                }

                foreach (EntityType derivedEntityType in derivedTypesLookup[entityType]) {
                    // Push the derived entity types on the stack
                    objectStack.Push(derivedEntityType);
                }
            }

            _tables = tables.AsReadOnly();

            GenerateClrTypes(serviceUri);
        }
Exemple #3
0
 public DataServiceContextWrapper(Uri serviceRoot)
 {
     if (serviceRoot == null)
     {
         throw new ArgumentNullException("serviceRoot");
     }
     _context = new DataServiceContext(serviceRoot)
     {
         MergeOption = MergeOption.OverwriteChanges
     };
     _metadataUri = _context.GetMetadataUri();
 }
        public DataServiceContextWrapper(Uri serviceRoot)
        {
            if (serviceRoot == null)
            {
                throw new ArgumentNullException("serviceRoot");
            }
            _context = new DataServiceContext(serviceRoot)
            {
                MergeOption = MergeOption.NoTracking
            };


            _metadataUri = _context.GetMetadataUri();

            AttachEvents();
        }
        public DataServiceContextWrapper(Uri serviceRoot)
        {
            if (serviceRoot == null)
            {
                throw new ArgumentNullException("serviceRoot");
            }
            _context = new DataServiceContext(serviceRoot)
            {
                MergeOption = MergeOption.OverwriteChanges
            };

            // Makes the context use our own resolve type function
            // since we know the exact type for the given wire name.
            // With this, the oData initialization time is cut in half.
            _context.ResolveType = ResolveTypeFunction;
            _metadataUri         = _context.GetMetadataUri();
        }
        public void CanConnectAndDownloadMetadata()
        {
            var context = new DataServiceContext(new Uri("http://localhost:9000/entity"), ODataProtocolVersion.V4);
            string metadataString;
            IEdmModel model;

            using ( var http = new WebClient() )
            {
                metadataString = http.DownloadString(context.GetMetadataUri());
            }

            using ( var xmlReader = XmlReader.Create(new StringReader(metadataString)) )
            {
                model = EdmxReader.Parse(xmlReader);
            }

            var entityTypes = model.SchemaElements.OfType<IEdmEntityType>().ToArray();

            foreach ( var type in entityTypes )
            {
                Console.WriteLine("{0}{{{1}}}", type.Name, string.Join(",", type.Properties().Select(p => p.Name).ToArray()));
            }
        }
        /// <summary>
        /// Loads the metadata and converts it into an EdmModel that is then used by a dataservice context
        /// This allows the user to use the DataServiceContext directly without having to manually pass an IEdmModel in the Format
        /// </summary>
        /// <returns>A service model to be used in format tracking</returns>
        internal IEdmModel LoadServiceModelFromNetwork()
        {
            HttpWebRequestMessage    httpRequest;
            BuildingRequestEventArgs requestEventArgs = null;

            // test hook for injecting a network request to use instead of the default
            if (InjectMetadataHttpNetworkRequest != null)
            {
                httpRequest = InjectMetadataHttpNetworkRequest();
            }
            else
            {
                requestEventArgs = new BuildingRequestEventArgs(
                    "GET",
                    context.GetMetadataUri(),
                    null,
                    null,
                    context.HttpStack);

                // fire the right events if they exist to allow user to modify the request
                if (context.HasBuildingRequestEventHandlers)
                {
                    requestEventArgs = context.CreateRequestArgsAndFireBuildingRequest(
                        requestEventArgs.Method,
                        requestEventArgs.RequestUri,
                        requestEventArgs.HeaderCollection,
                        requestEventArgs.ClientHttpStack,
                        requestEventArgs.Descriptor);
                }

                DataServiceClientRequestMessageArgs args = new DataServiceClientRequestMessageArgs(
                    requestEventArgs.Method,
                    requestEventArgs.RequestUri,
                    context.UseDefaultCredentials,
                    context.UsePostTunneling,
                    requestEventArgs.Headers);

                httpRequest = new HttpWebRequestMessage(args);
            }

            Descriptor descriptor = requestEventArgs != null ? requestEventArgs.Descriptor : null;

            // fire the right events if they exist
            if (context.HasSendingRequest2EventHandlers)
            {
                SendingRequest2EventArgs eventArgs = new SendingRequest2EventArgs(
                    httpRequest,
                    descriptor,
                    false);

                context.FireSendingRequest2(eventArgs);
            }

            Task <IODataResponseMessage> asyncResponse =
                Task <IODataResponseMessage> .Factory.FromAsync(httpRequest.BeginGetResponse, httpRequest.EndGetResponse,
                                                                httpRequest);

            IODataResponseMessage response = asyncResponse.GetAwaiter().GetResult();

            ReceivingResponseEventArgs responseEvent = new ReceivingResponseEventArgs(response, descriptor);

            context.FireReceivingResponseEvent(responseEvent);

            using (StreamReader streamReader = new StreamReader(response.GetStream()))
                using (XmlReader xmlReader = XmlReader.Create(streamReader))
                {
                    return(CsdlReader.Parse(xmlReader));
                }
        }
        private static IEdmModel ResolveModelFromMetadataUri(DataServiceContext context)
        {
            var metadataUri = context.GetMetadataUri().AbsoluteUri;

            return(EdmxReader.Parse(XmlReader.Create(metadataUri)));
        }
        /// <summary> Get main schema container name for given service uri </summary>
        /// <param name="cxInfo">connection info</param>
        /// <returns>Container name</returns>
        static string GetContainerName(IConnectionInfo cxInfo)
        {
            // odata v4 client inherites from DataServiceContext, use it for get IEdmModel

            IEdmModel model;

            var context = new DataServiceContext(new Uri(cxInfo.DatabaseInfo.Server))
            {
                Credentials = GetCredentials(cxInfo)
            };

            var metadataUri = context.GetMetadataUri();
            using (var reader = XmlReader.Create(metadataUri.ToString()))
            {
                model = EdmxReader.Parse(reader);
            }

            var root = model.SchemaElements.OfType<IEdmEntityContainer>().Single();

            // FIX ?
            var containerName = model.DeclaredNamespaces.Count() > 1 ? root.FullName() : root.Name;

            return containerName;
        }
 private static IEdmModel ResolveModelFromMetadataUri(DataServiceContext context)
 {
     var metadataUri = context.GetMetadataUri().AbsoluteUri;
     return EdmxReader.Parse(XmlReader.Create(metadataUri));
 }