Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Api as a service #112

Open
wants to merge 26 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
3fc624f
Initial Commit
mikepizzo Jul 19, 2019
d85f87e
Update packages
mikepizzo Jul 22, 2019
275724a
Added sample csdl files
mikepizzo Jul 22, 2019
1737887
commit GetTrippin api to get the schema from cosmos db
KanishManuja-MS Jul 22, 2019
c76af40
Merge branch 'ApiAsAService' of https://github.com/OData/lab into Api…
KanishManuja-MS Jul 22, 2019
7053d98
Update references
mikepizzo Jul 22, 2019
922245c
Merge branch 'ApiAsAService' of https://github.com/OData/lab into Api…
mikepizzo Jul 22, 2019
833cfe6
Add support for dynamic model building
mikepizzo Jul 23, 2019
39c8589
Dynamically load schema
mikepizzo Jul 23, 2019
f2c13ff
WIP
RigdhaAcharya-MSFT Jul 23, 2019
1d1da7f
WIP
RigdhaAcharya-MSFT Jul 23, 2019
2aab065
wip
RigdhaAcharya-MSFT Jul 23, 2019
054eb79
Starting to implement getting datasource from url.
mikepizzo Jul 24, 2019
4ba8046
Edm generator tool
RigdhaAcharya-MSFT Jul 24, 2019
cb27dd5
Merge branch 'ApiAsAService' of https://github.com/OData/lab into Api…
RigdhaAcharya-MSFT Jul 24, 2019
49cf29e
Dynamic Routing Works
mikepizzo Jul 24, 2019
5da6383
Merge branch 'ApiAsAService' of https://github.com/OData/lab into Api…
mikepizzo Jul 24, 2019
868e2a4
Merging DbContext generation
mikepizzo Jul 24, 2019
6998caf
fix for trippin
RigdhaAcharya-MSFT Jul 25, 2019
fd7e087
fix enum generation
RigdhaAcharya-MSFT Jul 25, 2019
8c77368
Exploration: Move type generation to a separate domain.
mikepizzo Jul 25, 2019
dad8d68
Merge branch 'ApiAsAService' of https://github.com/OData/lab into Api…
mikepizzo Jul 25, 2019
7788fed
Load model dynamically
mikepizzo Jul 27, 2020
0ae9e9a
More code clean-up
mikepizzo Jul 27, 2020
719416e
Minor cleanup
mikepizzo Jul 28, 2020
d280004
Update databases
mikepizzo Sep 11, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
104 changes: 104 additions & 0 deletions ApiAsAService/ApiAsAService.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.757
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{D8A3183C-1E9C-4D6C-AC72-4EF938EC9895}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataProviders", "DataProviders", "{37B52FD3-E72B-406F-8C5A-F146256D7743}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web", "Web", "{9D3D8728-C31B-4D5E-B471-79A9DBBA0E58}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Restier.Core", "RESTier\src\Microsoft.Restier.Core\Microsoft.Restier.Core.csproj", "{300B769A-3513-49D0-A035-7DB965C8D2A4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Restier.AspNet", "RESTier\src\Microsoft.Restier.AspNet\Microsoft.Restier.AspNet.csproj", "{8ECF4E97-1816-44AD-AD63-6ACF287ED520}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Restier.EntityFramework", "RESTier\src\Microsoft.Restier.EntityFramework\Microsoft.Restier.EntityFramework.csproj", "{0E373B2A-2ED2-4566-A275-6BE81CFFE00B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{901E6A2A-23EC-4BC8-B4C6-A3EF70D72702}"
ProjectSection(SolutionItems) = preProject
RESTier\src\Directory.Build.props = RESTier\src\Directory.Build.props
Directory.Build.props = Directory.Build.props
README.md = README.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "RESTier", "RESTier", "{76B4E51F-233E-4DD3-AABF-A6F47788040D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.OData", "WebAPI\src\Microsoft.AspNet.OData\Microsoft.AspNet.OData.csproj", "{A6F9775D-F7E2-424E-8363-79644A73038F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebAPI", "WebAPI", "{B43F200F-B847-48BE-9362-36D94C48521D}"
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.AspNet.OData.Shared", "WebAPI\src\Microsoft.AspNet.OData.Shared\Microsoft.AspNet.OData.Shared.shproj", "{B6B951B6-C3F0-4B8E-8955-E039145E7DEC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EdmObjectsGenerator", "EdmObjectsGenerator\EdmObjectsGenerator.csproj", "{3678C588-F1DD-4EF6-879A-3D1D8114A880}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApiAsAService", "ApiAsAService", "{BB79862F-A592-4A07-997A-36B372686928}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.OData.Service.ApiAsAService", "ApiAsAService\Microsoft.OData.Service.ApiAsAService.csproj", "{B379640E-9064-438D-8DA5-6F7B394C2C46}"
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
WebAPI\src\Microsoft.AspNet.OData.Shared\Microsoft.AspNet.OData.Shared.projitems*{a6f9775d-f7e2-424e-8363-79644a73038f}*SharedItemsImports = 4
WebAPI\src\Microsoft.AspNet.OData.Shared\Microsoft.AspNet.OData.Shared.projitems*{b6b951b6-c3f0-4b8e-8955-e039145e7dec}*SharedItemsImports = 13
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
CodeAnalysis|Any CPU = CodeAnalysis|Any CPU
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{300B769A-3513-49D0-A035-7DB965C8D2A4}.CodeAnalysis|Any CPU.ActiveCfg = Release|Any CPU
{300B769A-3513-49D0-A035-7DB965C8D2A4}.CodeAnalysis|Any CPU.Build.0 = Release|Any CPU
{300B769A-3513-49D0-A035-7DB965C8D2A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{300B769A-3513-49D0-A035-7DB965C8D2A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{300B769A-3513-49D0-A035-7DB965C8D2A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{300B769A-3513-49D0-A035-7DB965C8D2A4}.Release|Any CPU.Build.0 = Release|Any CPU
{8ECF4E97-1816-44AD-AD63-6ACF287ED520}.CodeAnalysis|Any CPU.ActiveCfg = Release|Any CPU
{8ECF4E97-1816-44AD-AD63-6ACF287ED520}.CodeAnalysis|Any CPU.Build.0 = Release|Any CPU
{8ECF4E97-1816-44AD-AD63-6ACF287ED520}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8ECF4E97-1816-44AD-AD63-6ACF287ED520}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8ECF4E97-1816-44AD-AD63-6ACF287ED520}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8ECF4E97-1816-44AD-AD63-6ACF287ED520}.Release|Any CPU.Build.0 = Release|Any CPU
{0E373B2A-2ED2-4566-A275-6BE81CFFE00B}.CodeAnalysis|Any CPU.ActiveCfg = Release|Any CPU
{0E373B2A-2ED2-4566-A275-6BE81CFFE00B}.CodeAnalysis|Any CPU.Build.0 = Release|Any CPU
{0E373B2A-2ED2-4566-A275-6BE81CFFE00B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0E373B2A-2ED2-4566-A275-6BE81CFFE00B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0E373B2A-2ED2-4566-A275-6BE81CFFE00B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E373B2A-2ED2-4566-A275-6BE81CFFE00B}.Release|Any CPU.Build.0 = Release|Any CPU
{A6F9775D-F7E2-424E-8363-79644A73038F}.CodeAnalysis|Any CPU.ActiveCfg = CodeAnalysis|Any CPU
{A6F9775D-F7E2-424E-8363-79644A73038F}.CodeAnalysis|Any CPU.Build.0 = CodeAnalysis|Any CPU
{A6F9775D-F7E2-424E-8363-79644A73038F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A6F9775D-F7E2-424E-8363-79644A73038F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A6F9775D-F7E2-424E-8363-79644A73038F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A6F9775D-F7E2-424E-8363-79644A73038F}.Release|Any CPU.Build.0 = Release|Any CPU
{3678C588-F1DD-4EF6-879A-3D1D8114A880}.CodeAnalysis|Any CPU.ActiveCfg = Release|Any CPU
{3678C588-F1DD-4EF6-879A-3D1D8114A880}.CodeAnalysis|Any CPU.Build.0 = Release|Any CPU
{3678C588-F1DD-4EF6-879A-3D1D8114A880}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3678C588-F1DD-4EF6-879A-3D1D8114A880}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3678C588-F1DD-4EF6-879A-3D1D8114A880}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3678C588-F1DD-4EF6-879A-3D1D8114A880}.Release|Any CPU.Build.0 = Release|Any CPU
{B379640E-9064-438D-8DA5-6F7B394C2C46}.CodeAnalysis|Any CPU.ActiveCfg = Release|Any CPU
{B379640E-9064-438D-8DA5-6F7B394C2C46}.CodeAnalysis|Any CPU.Build.0 = Release|Any CPU
{B379640E-9064-438D-8DA5-6F7B394C2C46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B379640E-9064-438D-8DA5-6F7B394C2C46}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B379640E-9064-438D-8DA5-6F7B394C2C46}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B379640E-9064-438D-8DA5-6F7B394C2C46}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{D8A3183C-1E9C-4D6C-AC72-4EF938EC9895} = {76B4E51F-233E-4DD3-AABF-A6F47788040D}
{37B52FD3-E72B-406F-8C5A-F146256D7743} = {76B4E51F-233E-4DD3-AABF-A6F47788040D}
{9D3D8728-C31B-4D5E-B471-79A9DBBA0E58} = {76B4E51F-233E-4DD3-AABF-A6F47788040D}
{300B769A-3513-49D0-A035-7DB965C8D2A4} = {D8A3183C-1E9C-4D6C-AC72-4EF938EC9895}
{8ECF4E97-1816-44AD-AD63-6ACF287ED520} = {9D3D8728-C31B-4D5E-B471-79A9DBBA0E58}
{0E373B2A-2ED2-4566-A275-6BE81CFFE00B} = {37B52FD3-E72B-406F-8C5A-F146256D7743}
{A6F9775D-F7E2-424E-8363-79644A73038F} = {B43F200F-B847-48BE-9362-36D94C48521D}
{B6B951B6-C3F0-4B8E-8955-E039145E7DEC} = {B43F200F-B847-48BE-9362-36D94C48521D}
{B379640E-9064-438D-8DA5-6F7B394C2C46} = {BB79862F-A592-4A07-997A-36B372686928}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5A37189C-A5E1-4871-AF65-8EBF2DA60FE3}
EndGlobalSection
EndGlobal
76 changes: 76 additions & 0 deletions ApiAsAService/ApiAsAService/Api/DynamicApi.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNet.OData.Query;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OData.Edm;
using Microsoft.OData.Edm.Vocabularies;
using Microsoft.OData.Service.ApiAsAService.Submit;
using Microsoft.Restier.Core;
using Microsoft.Restier.Core.Model;
using Microsoft.Restier.Core.Submit;
using Microsoft.Restier.EntityFramework;
using Microsoft.OData.Edm.Csdl;
using System.Xml;
using Microsoft.OData.Edm.Validation;


namespace Microsoft.OData.Service.ApiAsAService.Api
{
public class DynamicApi : ApiBase
{
public static new IServiceCollection ConfigureApi(Type apiType, IServiceCollection services)
{
// Add customized OData validation settings
Func<IServiceProvider, ODataValidationSettings> validationSettingFactory = (sp) => new ODataValidationSettings
{
MaxAnyAllExpressionDepth = 3,
MaxExpansionDepth = 3
};

IServiceCollection serviceCollection = ApiBase.ConfigureApi(apiType, services)
// .AddSingleton<ODataPayloadValueConverter, CustomizedPayloadValueConverter>()
.AddSingleton<ODataValidationSettings>(validationSettingFactory)
.AddService<IChangeSetItemFilter, CustomizedSubmitProcessor>()
.AddSingleton<IModelBuilder, DynamicModelBuilder>()
.AddScoped<IEdmModel>(sp => ((DynamicModelBuilder)sp.GetRequiredService<IModelBuilder>()).GetModel());

return serviceCollection;
}

public DynamicApi(IServiceProvider serviceProvider) : base(serviceProvider) { }
}

public class DynamicModelBuilder : IModelBuilder
{
public IModelBuilder InnerHandler { get; set; }

public string DataSourceName { get; set; }
public IEdmModel GetModel()
{
IEdmModel model;
IEnumerable<EdmError> errors;
var appData = System.Web.HttpContext.Current.Server.MapPath("~/App_Data");
var file = System.IO.Path.Combine(appData, DataSourceName + ".xml");

XmlReader xmlReader = XmlReader.Create(file);
if (CsdlReader.TryParse(xmlReader, out model, out errors))
{
return model;
}

throw new Exception("Couldn't parse xml");
}

public async Task<IEdmModel> GetModelAsync(ModelContext context, CancellationToken cancellationToken)
{
return await Task.FromResult(GetModel());
}

}
}
143 changes: 143 additions & 0 deletions ApiAsAService/ApiAsAService/App_Data/NWSimple.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:DataServices>
<Schema Namespace="NWind" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<EntityType Name="Product">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" />
<Property Name="Description" Type="Edm.String" />
<Property Name="ReleaseDate" Type="Edm.DateTimeOffset" Nullable="false" />
<Property Name="DiscontinuedDate" Type="Edm.DateTimeOffset" />
<Property Name="Rating" Type="Edm.Int16" Nullable="false" />
<Property Name="Price" Type="Edm.Double" Nullable="false" />
<NavigationProperty Name="Categories" Type="Collection(NWind.Category)" Partner="Products" />
<NavigationProperty Name="Supplier" Type="NWind.Supplier" Partner="Products" />
<NavigationProperty Name="ProductDetail" Type="NWind.ProductDetail" Partner="Product" />
</EntityType>
<EntityType Name="FeaturedProduct" BaseType="NWind.Product">
<NavigationProperty Name="Advertisement" Type="NWind.Advertisement" Partner="FeaturedProduct" />
</EntityType>
<EntityType Name="ProductDetail">
<Key>
<PropertyRef Name="ProductID" />
</Key>
<Property Name="ProductID" Type="Edm.Int32" Nullable="false" />
<Property Name="Details" Type="Edm.String" />
<NavigationProperty Name="Product" Type="NWind.Product" Partner="ProductDetail" />
</EntityType>
<EntityType Name="Category" OpenType="true">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" />
<NavigationProperty Name="Products" Type="Collection(NWind.Product)" Partner="Categories" />
</EntityType>
<EntityType Name="Supplier">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" />
<Property Name="Address" Type="NWind.Address" />
<Property Name="Location" Type="Edm.GeographyPoint" SRID="Variable" />
<Property Name="Concurrency" Type="Edm.Int32" Nullable="false" />
<NavigationProperty Name="Products" Type="Collection(NWind.Product)" Partner="Supplier" />
</EntityType>
<ComplexType Name="Address">
<Property Name="Street" Type="Edm.String" />
<Property Name="City" Type="Edm.String" />
<Property Name="State" Type="Edm.String" />
<Property Name="ZipCode" Type="Edm.String" />
<Property Name="Country" Type="Edm.String" />
</ComplexType>
<EntityType Name="Person">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" />
<NavigationProperty Name="PersonDetail" Type="NWind.PersonDetail" Partner="Person" />
</EntityType>
<EntityType Name="Customer" BaseType="NWind.Person">
<Property Name="TotalExpense" Type="Edm.Decimal" Nullable="false" />
</EntityType>
<EntityType Name="Employee" BaseType="NWind.Person">
<Property Name="EmployeeID" Type="Edm.Int64" Nullable="false" />
<Property Name="HireDate" Type="Edm.DateTimeOffset" Nullable="false" />
<Property Name="Salary" Type="Edm.Single" Nullable="false" />
</EntityType>
<EntityType Name="PersonDetail">
<Key>
<PropertyRef Name="PersonID" />
</Key>
<Property Name="PersonID" Type="Edm.Int32" Nullable="false" />
<Property Name="Age" Type="Edm.Byte" Nullable="false" />
<Property Name="Gender" Type="Edm.Boolean" Nullable="false" />
<Property Name="Phone" Type="Edm.String" />
<Property Name="Address" Type="NWind.Address" />
<Property Name="Photo" Type="Edm.Stream" Nullable="false" />
<NavigationProperty Name="Person" Type="NWind.Person" Partner="PersonDetail" />
</EntityType>
<EntityType Name="Advertisement" HasStream="true">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.Guid" Nullable="false" />
<Property Name="Name" Type="Edm.String" />
<Property Name="AirDate" Type="Edm.DateTimeOffset" Nullable="false" />
<NavigationProperty Name="FeaturedProduct" Type="NWind.FeaturedProduct" Partner="Advertisement" />
</EntityType>
<EntityContainer Name="DemoService">
<EntitySet Name="Products" EntityType="NWind.Product">
<NavigationPropertyBinding Path="NWind.FeaturedProduct/Advertisement" Target="Advertisements" />
<NavigationPropertyBinding Path="Categories" Target="Categories" />
<NavigationPropertyBinding Path="Supplier" Target="Suppliers" />
<NavigationPropertyBinding Path="ProductDetail" Target="ProductDetails" />
</EntitySet>
<EntitySet Name="ProductDetails" EntityType="NWind.ProductDetail">
<NavigationPropertyBinding Path="Product" Target="Products" />
</EntitySet>
<EntitySet Name="Categories" EntityType="NWind.Category">
<NavigationPropertyBinding Path="Products" Target="Products" />
</EntitySet>
<EntitySet Name="Suppliers" EntityType="NWind.Supplier">
<NavigationPropertyBinding Path="Products" Target="Products" />
</EntitySet>
<EntitySet Name="Persons" EntityType="NWind.Person">
<NavigationPropertyBinding Path="PersonDetail" Target="PersonDetails" />
</EntitySet>
<EntitySet Name="PersonDetails" EntityType="NWind.PersonDetail">
<NavigationPropertyBinding Path="Person" Target="Persons" />
</EntitySet>
<EntitySet Name="Advertisements" EntityType="NWind.Advertisement">
<NavigationPropertyBinding Path="FeaturedProduct" Target="Products" />
</EntitySet>
</EntityContainer>
<Annotations Target="NWind.DemoService">
<Annotation Term="Org.OData.Display.V1.Description" String="This is a sample OData service with vocabularies" />
</Annotations>
<Annotations Target="NWind.Product">
<Annotation Term="Org.OData.Display.V1.Description" String="All Products available in the online store" />
</Annotations>
<Annotations Target="NWind.Product/Name">
<Annotation Term="Org.OData.Display.V1.DisplayName" String="Product Name" />
</Annotations>
<Annotations Target="NWind.DemoService/Suppliers">
<Annotation Term="Org.OData.Publication.V1.PublisherName" String="Microsoft Corp." />
<Annotation Term="Org.OData.Publication.V1.PublisherId" String="MSFT" />
<Annotation Term="Org.OData.Publication.V1.Keywords" String="Inventory, Supplier, Advertisers, Sales, Finance" />
<Annotation Term="Org.OData.Publication.V1.AttributionUrl" String="http://www.odata.org/" />
<Annotation Term="Org.OData.Publication.V1.AttributionDescription" String="All rights reserved" />
<Annotation Term="Org.OData.Publication.V1.DocumentationUrl " String="http://www.odata.org/" />
<Annotation Term="Org.OData.Publication.V1.TermsOfUseUrl" String="All rights reserved" />
<Annotation Term="Org.OData.Publication.V1.PrivacyPolicyUrl" String="http://www.odata.org/" />
<Annotation Term="Org.OData.Publication.V1.LastModified" String="4/2/2013" />
<Annotation Term="Org.OData.Publication.V1.ImageUrl " String="http://www.odata.org/" />
</Annotations>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
Loading