[OLINGO-1191] Code Improvements

This commit is contained in:
ramya vasanth 2017-12-14 10:37:35 +05:30
parent b86aa5d977
commit 387ba9c096
9 changed files with 458 additions and 9 deletions

View File

@ -496,10 +496,10 @@ public class ODataBinderImpl implements ODataBinder {
inlineEntitySet)));
}
private EdmEntityType findEntityType(
private EdmType findEntityType(
final String entitySetOrSingletonOrType, final EdmEntityContainer container) {
EdmEntityType type = null;
EdmType type = null;
final String firstToken = StringUtils.substringBefore(entitySetOrSingletonOrType, "/");
EdmBindingTarget bindingTarget = container.getEntitySet(firstToken);
@ -514,9 +514,14 @@ public class ODataBinderImpl implements ODataBinder {
final String[] splitted = entitySetOrSingletonOrType.split("/");
if (splitted.length > 1) {
for (int i = 1; i < splitted.length && type != null; i++) {
final EdmNavigationProperty navProp = type.getNavigationProperty(splitted[i]);
final EdmNavigationProperty navProp = ((EdmStructuredType) type).getNavigationProperty(splitted[i]);
if (navProp == null) {
EdmProperty property = ((EdmStructuredType) type).getStructuralProperty(splitted[i]);
if (property != null) {
type = property.getType();
} else {
type = null;
}
} else {
type = navProp.getType();
}
@ -548,17 +553,17 @@ public class ODataBinderImpl implements ODataBinder {
for (EdmSchema schema : edm.getSchemas()) {
final EdmEntityContainer container = schema.getEntityContainer();
if (container != null) {
final EdmEntityType entityType = findEntityType(contextURL.getEntitySetOrSingletonOrType(), container);
final EdmType structuredType = findEntityType(contextURL.getEntitySetOrSingletonOrType(), container);
if (entityType != null) {
if (structuredType != null) {
if (contextURL.getNavOrPropertyPath() == null) {
type = entityType;
type = structuredType;
} else {
final EdmNavigationProperty navProp =
entityType.getNavigationProperty(contextURL.getNavOrPropertyPath());
((EdmStructuredType) structuredType).getNavigationProperty(contextURL.getNavOrPropertyPath());
type = navProp == null
? entityType
? structuredType
: navProp.getType();
}
}

View File

@ -26,16 +26,39 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import org.apache.olingo.client.api.EdmEnabledODataClient;
import org.apache.olingo.client.api.data.ResWrap;
import org.apache.olingo.client.api.domain.ClientEntity;
import org.apache.olingo.client.api.domain.ClientEntitySet;
import org.apache.olingo.client.api.serialization.ODataDeserializerException;
import org.apache.olingo.commons.api.data.EntityCollection;
import org.apache.olingo.commons.api.edm.Edm;
import org.apache.olingo.commons.api.format.ContentType;
import org.junit.Test;
public class EntitySetTest extends AbstractTest {
private EdmEnabledODataClient getEdmEnabledClient1() {
return new EdmEnabledODataClientImpl(null, null, null) {
private Edm edm;
@Override
public Edm getEdm(final String metadataETag) {
return getCachedEdm();
}
@Override
public Edm getCachedEdm() {
if (edm == null) {
edm = getReader().readMetadata(getClass().getResourceAsStream("metadata_sample.xml"));
}
return edm;
}
};
}
private void read(final ContentType contentType) throws IOException, ODataDeserializerException {
final InputStream input = getClass().getResourceAsStream("Customers." + getSuffix(contentType));
final ClientEntitySet entitySet = client.getBinder().getODataEntitySet(
@ -102,4 +125,32 @@ public class EntitySetTest extends AbstractTest {
public void jsonRef() throws Exception {
ref(ContentType.JSON);
}
@Test
public void testContainmentNav() throws Exception {
final InputStream input = getClass().getResourceAsStream("containmentNav1." +
getSuffix(ContentType.JSON_FULL_METADATA));
final ClientEntitySet entity = getEdmEnabledClient1().getBinder().
getODataEntitySet(client.getDeserializer(
ContentType.JSON_FULL_METADATA).toEntitySet(input));
assertNotNull(entity);
assertEquals("olingo.odata.test1.ETTwoCont",
entity.getEntities().get(0).getTypeName().getFullQualifiedNameAsString());
assertEquals("olingo.odata.test1.ETTwoCont",
entity.getEntities().get(1).getTypeName().getFullQualifiedNameAsString());
}
@Test
public void testContainmentNavOnSingleton() throws Exception {
final InputStream input = getClass().getResourceAsStream("containmentNav4." +
getSuffix(ContentType.JSON_FULL_METADATA));
final ClientEntitySet entity = getEdmEnabledClient1().getBinder().
getODataEntitySet(client.getDeserializer(
ContentType.JSON_FULL_METADATA).toEntitySet(input));
assertNotNull(entity);
assertEquals("olingo.odata.test1.ETCont",
entity.getEntities().get(0).getTypeName().getFullQualifiedNameAsString());
assertEquals("olingo.odata.test1.ETCont",
entity.getEntities().get(1).getTypeName().getFullQualifiedNameAsString());
}
}

View File

@ -77,6 +77,27 @@ public class EntityTest extends AbstractTest {
};
}
private EdmEnabledODataClient getEdmEnabledClient1() {
return new EdmEnabledODataClientImpl(null, null, null) {
private Edm edm;
@Override
public Edm getEdm(final String metadataETag) {
return getCachedEdm();
}
@Override
public Edm getCachedEdm() {
if (edm == null) {
edm = getReader().readMetadata(getClass().getResourceAsStream("metadata_sample.xml"));
}
return edm;
}
};
}
private void singleton(final ContentType contentType) throws Exception {
final InputStream input = getClass().getResourceAsStream("VipCustomer." + getSuffix(contentType));
final ClientEntity entity = client.getBinder().getODataEntity(
@ -404,4 +425,34 @@ public class EntityTest extends AbstractTest {
assertTrue(property.isPrimitive());
assertEquals(property.getValueType(), ValueType.PRIMITIVE);
}
@Test
public void testContainmentNav() throws Exception {
final InputStream input = getClass().getResourceAsStream(
"containmentNav." + getSuffix(ContentType.JSON_FULL_METADATA));
final ClientEntity entity = getEdmEnabledClient1().getBinder().getODataEntity(
client.getDeserializer(ContentType.JSON_FULL_METADATA).toEntity(input));
assertNotNull(entity);
assertEquals("olingo.odata.test1.ETCont", entity.getTypeName().getFullQualifiedNameAsString());
}
@Test
public void testContainmentNavOnComplexType() throws Exception {
final InputStream input = getClass().getResourceAsStream(
"containmentNav2." + getSuffix(ContentType.JSON_FULL_METADATA));
final ClientEntity entity = getEdmEnabledClient1().getBinder().getODataEntity(
client.getDeserializer(ContentType.JSON_FULL_METADATA).toEntity(input));
assertNotNull(entity);
assertEquals("olingo.odata.test1.ETCont", entity.getTypeName().getFullQualifiedNameAsString());
}
@Test
public void testContainmentNavOnSingleton() throws Exception {
final InputStream input = getClass().getResourceAsStream(
"containmentNav3." + getSuffix(ContentType.JSON_FULL_METADATA));
final ClientEntity entity = getEdmEnabledClient1().getBinder().getODataEntity(
client.getDeserializer(ContentType.JSON_FULL_METADATA).toEntity(input));
assertNotNull(entity);
assertEquals("olingo.odata.test1.ETCont", entity.getTypeName().getFullQualifiedNameAsString());
}
}

View File

@ -0,0 +1,33 @@
{
"@odata.context": "../../$metadata#ESKeyNavCont(-32766)/NavPropertyETBaseContMany(-32768)/olingo.odata.test1.ETCont/$entity",
"@odata.metadataEtag": "W/\"c32f78fd-8c2d-44a1-a602-2c6527d44930\"",
"PropertyInt16@odata.type": "#Int16",
"PropertyInt16": -32768,
"PropertyString": "Second Resource - negative values",
"PropertyInt32@odata.type": "#Int32",
"PropertyInt32": -2147483648,
"PropertyInt64@odata.type": "#Int64",
"PropertyInt64": -9223372036854775808,
"PropertySingle@odata.type": "#Single",
"PropertySingle": -179000000,
"PropertyDouble": -179000,
"PropertyDecimal@odata.type": "#Decimal",
"PropertyDecimal": -34,
"PropertyBinary@odata.type": "#Binary",
"PropertyBinary": "ASNFZ4mrze8=",
"PropertyDate@odata.type": "#Date",
"PropertyDate": "2015-11-05",
"PropertyDateTimeOffset@odata.type": "#DateTimeOffset",
"PropertyDateTimeOffset": "2005-12-03T07:17:08Z",
"PropertyDuration@odata.type": "#Duration",
"PropertyDuration": "PT9S",
"PropertyGuid@odata.type": "#Guid",
"PropertyGuid": "76543201-23ab-cdef-0123-456789dddfff",
"PropertyTimeOfDay@odata.type": "#TimeOfDay",
"PropertyTimeOfDay": "23:49:14",
"PropertyBoolean": false,
"PropertyByte@odata.type": "#Byte",
"PropertyByte": 0,
"PropertySByte@odata.type": "#SByte",
"PropertySByte": -128
}

View File

@ -0,0 +1,36 @@
{
"@odata.context": "../../$metadata#ESKeyNavCont(-32766)/NavPropertyETBaseContMany(0)/NavPropertyETBaseContTwoContMany",
"@odata.metadataEtag": "W/\"c32f78fd-8c2d-44a1-a602-2c6527d44930\"",
"value": [
{
"PropertyInt16": -32768,
"PropertyString": "Second Resource - negative values",
"PropertyInt32": -2147483648,
"PropertyInt64": -9223372036854775808,
"PropertySingle": -179000000,
"PropertyDouble": -179000,
"PropertyDecimal": -34,
"PropertyBinary": "ASNFZ4mrze8=",
"PropertyDate": "2015-11-05",
"PropertyDateTimeOffset": "2005-12-03T07:17:08Z",
"PropertyDuration": "PT9S",
"PropertyGuid": "76543201-23ab-cdef-0123-456789dddfff",
"PropertyTimeOfDay": "23:49:14"
},
{
"PropertyInt16": 0,
"PropertyString": "",
"PropertyInt32": 0,
"PropertyInt64": 0,
"PropertySingle": 0,
"PropertyDouble": 0,
"PropertyDecimal": 0,
"PropertyBinary": "",
"PropertyDate": "1970-01-01",
"PropertyDateTimeOffset": "2005-12-03T00:00:00Z",
"PropertyDuration": "PT0S",
"PropertyGuid": "76543201-23ab-cdef-0123-456789cccddd",
"PropertyTimeOfDay": "00:01:01"
}
]
}

View File

@ -0,0 +1,33 @@
{
"@odata.context": "../../$metadata#ESKeyNavCont(-32766)/PropertyCompNavCont/NavPropertyETTwoKeyNavETContOne/$entity",
"@odata.metadataEtag": "W/\"c32f78fd-8c2d-44a1-a602-2c6527d44930\"",
"PropertyInt16@odata.type": "#Int16",
"PropertyInt16": -32768,
"PropertyString": "Second Resource - negative values",
"PropertyInt32@odata.type": "#Int32",
"PropertyInt32": -2147483648,
"PropertyInt64@odata.type": "#Int64",
"PropertyInt64": -9223372036854775808,
"PropertySingle@odata.type": "#Single",
"PropertySingle": -179000000,
"PropertyDouble": -179000,
"PropertyDecimal@odata.type": "#Decimal",
"PropertyDecimal": -34,
"PropertyBinary@odata.type": "#Binary",
"PropertyBinary": "ASNFZ4mrze8=",
"PropertyDate@odata.type": "#Date",
"PropertyDate": "2015-11-05",
"PropertyDateTimeOffset@odata.type": "#DateTimeOffset",
"PropertyDateTimeOffset": "2005-12-03T07:17:08Z",
"PropertyDuration@odata.type": "#Duration",
"PropertyDuration": "PT9S",
"PropertyGuid@odata.type": "#Guid",
"PropertyGuid": "76543201-23ab-cdef-0123-456789dddfff",
"PropertyTimeOfDay@odata.type": "#TimeOfDay",
"PropertyTimeOfDay": "23:49:14",
"PropertyBoolean": false,
"PropertyByte@odata.type": "#Byte",
"PropertyByte": 0,
"PropertySByte@odata.type": "#SByte",
"PropertySByte": -128
}

View File

@ -0,0 +1,33 @@
{
"@odata.context": "../../$metadata#SI/PropertyCompNavCont/NavPropertyETTwoKeyNavETContOne/$entity",
"@odata.metadataEtag": "W/\"c32f78fd-8c2d-44a1-a602-2c6527d44930\"",
"PropertyInt16@odata.type": "#Int16",
"PropertyInt16": -32768,
"PropertyString": "Second Resource - negative values",
"PropertyInt32@odata.type": "#Int32",
"PropertyInt32": -2147483648,
"PropertyInt64@odata.type": "#Int64",
"PropertyInt64": -9223372036854775808,
"PropertySingle@odata.type": "#Single",
"PropertySingle": -179000000,
"PropertyDouble": -179000,
"PropertyDecimal@odata.type": "#Decimal",
"PropertyDecimal": -34,
"PropertyBinary@odata.type": "#Binary",
"PropertyBinary": "ASNFZ4mrze8=",
"PropertyDate@odata.type": "#Date",
"PropertyDate": "2015-11-05",
"PropertyDateTimeOffset@odata.type": "#DateTimeOffset",
"PropertyDateTimeOffset": "2005-12-03T07:17:08Z",
"PropertyDuration@odata.type": "#Duration",
"PropertyDuration": "PT9S",
"PropertyGuid@odata.type": "#Guid",
"PropertyGuid": "76543201-23ab-cdef-0123-456789dddfff",
"PropertyTimeOfDay@odata.type": "#TimeOfDay",
"PropertyTimeOfDay": "23:49:14",
"PropertyBoolean": false,
"PropertyByte@odata.type": "#Byte",
"PropertyByte": 0,
"PropertySByte@odata.type": "#SByte",
"PropertySByte": -128
}

View File

@ -0,0 +1,68 @@
{
"@odata.context": "../../$metadata#SI/NavPropertyETContMany",
"@odata.metadataEtag": "W/\"c32f78fd-8c2d-44a1-a602-2c6527d44930\"",
"value": [
{
"PropertyInt16@odata.type": "#Int16",
"PropertyInt16": -32768,
"PropertyString": "Second Resource - negative values",
"PropertyInt32@odata.type": "#Int32",
"PropertyInt32": -2147483648,
"PropertyInt64@odata.type": "#Int64",
"PropertyInt64": -9223372036854775808,
"PropertySingle@odata.type": "#Single",
"PropertySingle": -179000000,
"PropertyDouble": -179000,
"PropertyDecimal@odata.type": "#Decimal",
"PropertyDecimal": -34,
"PropertyBinary@odata.type": "#Binary",
"PropertyBinary": "ASNFZ4mrze8=",
"PropertyDate@odata.type": "#Date",
"PropertyDate": "2015-11-05",
"PropertyDateTimeOffset@odata.type": "#DateTimeOffset",
"PropertyDateTimeOffset": "2005-12-03T07:17:08Z",
"PropertyDuration@odata.type": "#Duration",
"PropertyDuration": "PT9S",
"PropertyGuid@odata.type": "#Guid",
"PropertyGuid": "76543201-23ab-cdef-0123-456789dddfff",
"PropertyTimeOfDay@odata.type": "#TimeOfDay",
"PropertyTimeOfDay": "23:49:14",
"PropertyBoolean": false,
"PropertyByte@odata.type": "#Byte",
"PropertyByte": 0,
"PropertySByte@odata.type": "#SByte",
"PropertySByte": -128
},
{
"PropertyInt16@odata.type": "#Int16",
"PropertyInt16": -365,
"PropertyString": "Second Resource - negative values",
"PropertyInt32@odata.type": "#Int32",
"PropertyInt32": -2147483648,
"PropertyInt64@odata.type": "#Int64",
"PropertyInt64": -9223372036854775808,
"PropertySingle@odata.type": "#Single",
"PropertySingle": -179000000,
"PropertyDouble": -179000,
"PropertyDecimal@odata.type": "#Decimal",
"PropertyDecimal": -34,
"PropertyBinary@odata.type": "#Binary",
"PropertyBinary": "ASNFZ4mrze8=",
"PropertyDate@odata.type": "#Date",
"PropertyDate": "2015-11-05",
"PropertyDateTimeOffset@odata.type": "#DateTimeOffset",
"PropertyDateTimeOffset": "2005-12-03T07:17:08Z",
"PropertyDuration@odata.type": "#Duration",
"PropertyDuration": "PT9S",
"PropertyGuid@odata.type": "#Guid",
"PropertyGuid": "76543201-23ab-cdef-0123-456789dddfff",
"PropertyTimeOfDay@odata.type": "#TimeOfDay",
"PropertyTimeOfDay": "23:49:14",
"PropertyBoolean": false,
"PropertyByte@odata.type": "#Byte",
"PropertyByte": 0,
"PropertySByte@odata.type": "#SByte",
"PropertySByte": -128
}
]
}

View File

@ -0,0 +1,139 @@
<?xml version='1.0' encoding='UTF-8'?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Reference Uri="../v4.0/cs02/vocabularies/Org.OData.Core.V1.xml">
<edmx:Include Namespace="Org.OData.Core.V1" Alias="Core" />
</edmx:Reference>
<edmx:DataServices>
<Schema xmlns="http://docs.oasis-open.org/odata/ns/edm"
Namespace="olingo.odata.test1" Alias="Namespace1_Alias">
<EntityType Name="ETKeyNavCont">
<Key>
<PropertyRef Name="PropertyInt16" />
</Key>
<Property Name="PropertyInt16" Type="Edm.Int16" Nullable="false" />
<Property Name="PropertyString" Type="Edm.String" Nullable="false" />
<Property Name="PropertyCompNavCont" Type="Namespace1_Alias.CTNavCont" />
<NavigationProperty Name="NavPropertyETContOne"
Type="Namespace1_Alias.ETCont" ContainsTarget="true" />
<NavigationProperty Name="NavPropertyETContMany"
Type="Collection(Namespace1_Alias.ETCont)" ContainsTarget="true" />
<NavigationProperty Name="NavPropertyETBaseContMany"
Type="Collection(Namespace1_Alias.ETBaseCont)" ContainsTarget="true" />
</EntityType>
<EntityType Name="ETBaseCont">
<Key>
<PropertyRef Name="PropertyInt16" />
</Key>
<Property Name="PropertyInt16" Type="Edm.Int16" Nullable="false" />
<Property Name="PropertyString" Type="Edm.String" />
<Property Name="PropertyInt32" Type="Edm.Int32" />
<Property Name="PropertyInt64" Type="Edm.Int64" />
<Property Name="PropertySingle" Type="Edm.Single" />
<Property Name="PropertyDouble" Type="Edm.Double" />
<Property Name="PropertyDecimal" Type="Edm.Decimal" Scale="10" />
<Property Name="PropertyBinary" Type="Edm.Binary" />
<Property Name="PropertyDate" Type="Edm.Date" />
<Property Name="PropertyDateTimeOffset" Type="Edm.DateTimeOffset" />
<Property Name="PropertyDuration" Type="Edm.Duration" />
<Property Name="PropertyGuid" Type="Edm.Guid" />
<Property Name="PropertyTimeOfDay" Type="Edm.TimeOfDay" />
<NavigationProperty Name="NavPropertyETBaseContTwoContMany"
Type="Collection(Namespace1_Alias.ETTwoCont)" ContainsTarget="true" />
<NavigationProperty Name="NavPropertyETBaseContTwoContOne"
Type="Namespace1_Alias.ETTwoCont" Nullable="false" ContainsTarget="true" />
</EntityType>
<EntityType Name="ETCont" BaseType="Namespace1_Alias.ETBaseCont">
<Property Name="PropertyBoolean" Type="Edm.Boolean" />
<Property Name="PropertyByte" Type="Edm.Byte" />
<Property Name="PropertySByte" Type="Edm.SByte" />
</EntityType>
<EntityType Name="ETTwoCont">
<Key>
<PropertyRef Name="PropertyInt16" />
<PropertyRef Name="PropertyString" />
</Key>
<Property Name="PropertyInt16" Type="Edm.Int16" Nullable="false" />
<Property Name="PropertyString" Type="Edm.String" Nullable="false" />
<Property Name="PropertyInt32" Type="Edm.Int32" />
<Property Name="PropertyInt64" Type="Edm.Int64" />
<Property Name="PropertySingle" Type="Edm.Single" />
<Property Name="PropertyDouble" Type="Edm.Double" />
<Property Name="PropertyDecimal" Type="Edm.Decimal" Scale="10" />
<Property Name="PropertyBinary" Type="Edm.Binary" />
<Property Name="PropertyDate" Type="Edm.Date" />
<Property Name="PropertyDateTimeOffset" Type="Edm.DateTimeOffset" />
<Property Name="PropertyDuration" Type="Edm.Duration" />
<Property Name="PropertyGuid" Type="Edm.Guid" />
<Property Name="PropertyTimeOfDay" Type="Edm.TimeOfDay" />
</EntityType>
<ComplexType Name="CTNavCont">
<NavigationProperty Name="NavPropertyETTwoKeyNavETContOne"
Type="Namespace1_Alias.ETCont" ContainsTarget="true" />
<NavigationProperty Name="NavPropertyETTwoKeyNavETContMany"
Type="Collection(Namespace1_Alias.ETBaseCont)" ContainsTarget="true" />
</ComplexType>
<EntityType Name="ETTwoPrim">
<Key>
<PropertyRef Name="PropertyInt16" />
</Key>
<Property Name="PropertyInt16" Type="Edm.Int16" Nullable="false" />
<Property Name="PropertyString" Type="Edm.String" />
<Property Name="PropertyCompNavCont" Type="Namespace1_Alias.CTNavCont" />
<NavigationProperty Name="NavPropertyETContOne"
Type="Namespace1_Alias.ETCont" ContainsTarget="true" />
<NavigationProperty Name="NavPropertyETContMany"
Type="Collection(Namespace1_Alias.ETCont)" ContainsTarget="true" />
</EntityType>
<EntityContainer Name="Container">
<EntitySet Name="ESKeyNavCont" EntityType="Namespace1_Alias.ETKeyNavCont">
<NavigationPropertyBinding
Path="NavPropertyETTwoKeyNavOne/NavPropertyETKeyNavOne" Target="ESKeyNav" />
<NavigationPropertyBinding
Path="NavPropertyETTwoKeyNavMany/NavPropertyETKeyNavOne" Target="ESKeyNav" />
<NavigationPropertyBinding Path="NavPropertyETTwoKeyNavContOne"
Target="ESTwoKeyNavCont" />
<NavigationPropertyBinding Path="NavPropertyETTwoKeyNavContMany"
Target="ESTwoKeyNavCont" />
<NavigationPropertyBinding
Path="PropertyCompNavCont/NavPropertyETKeyNavOne/NavPropertyETKeyNavOne"
Target="ESKeyNav" />
<NavigationPropertyBinding
Path="PropertyCompNavCont/NavPropertyETKeyNavMany/NavPropertyETKeyNavOne"
Target="ESKeyNav" />
<NavigationPropertyBinding
Path="PropertyCompNavCont/NavPropertyETTwoKeyNavOne/NavPropertyETKeyNavOne"
Target="ESKeyNav" />
<NavigationPropertyBinding
Path="PropertyCompNavCont/NavPropertyETTwoKeyNavMany/NavPropertyETKeyNavOne"
Target="ESKeyNav" />
<Annotation Term="Core.Description">
<String>Contains entities with containment navigation properties
</String>
</Annotation>
<Annotation Term="Namespace1_Alias.Data">
<Bool>false</Bool>
</Annotation>
</EntitySet>
<Singleton Name="SI" Type="Namespace1_Alias.ETTwoPrim" />
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>