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