示例#1
0
        private IEdmModel LoadModel()
        {
            var       xmlTextReader = new XmlTextReader(GetMetadataUri().ToString());
            IEdmModel model         = EdmxReader.Parse(xmlTextReader);

            return(model);
        }
示例#2
0
        public static void Register(HttpConfiguration config)
        {
            var model2 = EdmxReader.Parse(XmlReader.Create("http://localhost:9091/odata/$metadata"));

            var model = new EdmModel();

            model.AddReferencedModel(model2);

            var reference = new EdmReference("http://localhost:9091/odata/$metadata");

            reference.AddInclude(new EdmInclude("Model2", "SampleService2.Models"));
            model.SetEdmReferences(new List <IEdmReference> {
                reference
            });

            var container = new EdmEntityContainer("NS1", "Default");
            var order     = model2.FindDeclaredType("SampleService2.Models.Order") as IEdmEntityType;

            model2.SetAnnotationValue <ClrTypeAnnotation>(order, new ClrTypeAnnotation(typeof(Order)));
            container.AddEntitySet("Orders", order);
            model.AddElement(container);

            var product = new EdmEntityType("NS1", "Product");

            product.AddKeys(product.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32));
            product.AddStructuralProperty("Name", EdmPrimitiveTypeKind.String);
            model.AddElement(product);

            config.MapODataServiceRoute("odata", "odata", model);
        }
示例#3
0
        public void FindVocabularyAnnotationInParallel()
        {
            int annotationCount = 30;
            var edmModel        = new EdmParModel().Model as EdmModel;
            var container       = edmModel.EntityContainer;

            for (int i = 0; i < annotationCount; i++)
            {
                EdmTerm term = new EdmTerm("NS", "Test" + i, EdmPrimitiveTypeKind.String);
                EdmVocabularyAnnotation annotation = new EdmAnnotation(
                    container,
                    term,
                    new EdmStringConstant("desc" + i));
                edmModel.AddVocabularyAnnotation(annotation);
            }

            IEdmModel loadedEdmModel = null;

            using (var ms = new MemoryStream())
            {
                var xw = XmlWriter.Create(ms, new XmlWriterSettings {
                    Indent = true
                });

                IEnumerable <EdmError> errors;
                var res = EdmxWriter.TryWriteEdmx(edmModel, xw, EdmxTarget.OData, out errors);
                xw.Flush();
                ms.Flush();
                ms.Seek(0, SeekOrigin.Begin);
                using (var sr = new StreamReader(ms))
                {
                    var metadata = sr.ReadToEnd();
                    loadedEdmModel = EdmxReader.Parse(XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(metadata))));
                }
            }
            container = loadedEdmModel.EntityContainer;

            int errorCount           = 0;
            int totalAnnotationCount = 0;
            int taskCount            = 100;

            Parallel.ForEach(
                Enumerable.Range(0, taskCount),
                index =>
            {
                try
                {
                    var count = loadedEdmModel.FindVocabularyAnnotations(container).ToList().Count();
                    Interlocked.Add(ref totalAnnotationCount, count);
                }
                catch (Exception ew)
                {
                    Console.WriteLine(ew);
                    Interlocked.Increment(ref errorCount);
                }
            });

            Assert.AreEqual(0, errorCount);
            Assert.AreEqual(taskCount * annotationCount, totalAnnotationCount);
        }
示例#4
0
        public void CanRenamePropertiesInRegularModelBuilder()
        {
            HttpRequestMessage  request  = new HttpRequestMessage(HttpMethod.Get, BaseAddress + "/explicit/$metadata");
            HttpResponseMessage response = Client.SendAsync(request).Result;
            IEdmModel           model    = EdmxReader.Parse(XmlReader.Create(response.Content.ReadAsStreamAsync().Result));
            // Can change the name of regular, complex and navigation properties.
            IEdmEntityType customer = model.FindDeclaredType("ModelAliasing.Customer") as IEdmEntityType;

            Assert.NotNull(customer);
            Assert.NotNull(customer.FindProperty("FinancialAddress"));
            Assert.NotNull(customer.FindProperty("ClientName"));
            Assert.NotNull(customer.FindProperty("Purchases"));
            // Can change the name of properties on complex objects
            IEdmComplexType address = model.FindDeclaredType("Location.Direction") as IEdmComplexType;

            Assert.NotNull(address);
            Assert.NotNull(address.FindProperty("Reign"));
            //Can change the name of properties on derived entities.
            IEdmEntityType expressOrder = model.FindDeclaredType("Purchasing.ExpressOrder") as IEdmEntityType;

            Assert.NotNull(expressOrder);
            //Can change the name of properties on derived entities when added explicitly.
            Assert.NotNull(expressOrder.FindProperty("Fee"));
            //Data contract attribute doesn't change the name of the property.
            Assert.Null(expressOrder.FindProperty("DeliveryDate"));
            Assert.Null(expressOrder.FindProperty("GuanteedDeliveryDate"));
            // Data contract attribute doesn't change the names of the properties
            IEdmEntityType ordersLines = model.FindDeclaredType("WebStack.QA.Test.OData.ModelAliasing.ModelAliasingMetadataOrderLine") as IEdmEntityType;

            Assert.NotNull(ordersLines);
            Assert.Null(ordersLines.FindProperty("Product"));
            Assert.NotNull(ordersLines.FindProperty("Item"));
            // Data contract attribute doesn't override any explicit configuration on the model builder
            Assert.NotNull(ordersLines.FindProperty("Cost"));
        }
示例#5
0
 private static IEdmModel GetEndpointModel(string modelUrl)
 {
     using (WebResponse response = ReaderUtils.CreateRequest(modelUrl).GetResponse())
     {
         return(EdmxReader.Parse(XmlReader.Create(response.GetResponseStream())));
     }
 }
示例#6
0
        public void CanRenameTypesAndNamespacesInRegularModelBuilder()
        {
            HttpRequestMessage  request  = new HttpRequestMessage(HttpMethod.Get, BaseAddress + "/explicit/$metadata");
            HttpResponseMessage response = Client.SendAsync(request).Result;
            IEdmModel           model    = EdmxReader.Parse(XmlReader.Create(response.Content.ReadAsStreamAsync().Result));
            //Can rename an entity + namespace
            IEdmEntityType customer = model.FindDeclaredType("ModelAliasing.Customer") as IEdmEntityType;

            Assert.NotNull(customer);
            //Explicit configuration on the model builder overrides any configuration on the DataContract attribute.
            IEdmEntityType orders = model.FindDeclaredType("AliasedNamespace.Order") as IEdmEntityType;

            Assert.NotNull(orders);
            //Can rename a derived entity  name + namespace
            IEdmEntityType expressOrder = model.FindDeclaredType("Purchasing.ExpressOrder") as IEdmEntityType;

            Assert.NotNull(expressOrder);
            //DataContract doesn't rename the entity or the namespace
            IEdmEntityType freeDeliveryOrder = model.FindDeclaredType("Purchasing.FreeOrder") as IEdmEntityType;

            Assert.NotNull(freeDeliveryOrder);
            //DataContract doesn't rename the entity or the namespace
            IEdmEntityType ordersLines = model.FindDeclaredType("Billing.OrderLine") as IEdmEntityType;

            Assert.Null(ordersLines);
            //Can change the name and the namespaces for complex types
            IEdmComplexType region = model.FindDeclaredType("Location.PoliticalRegion") as IEdmComplexType;

            Assert.NotNull(region);
            IEdmComplexType address = model.FindDeclaredType("Location.Direction") as IEdmComplexType;

            Assert.NotNull(address);
        }
示例#7
0
        static void Main(string[] args)
        {
            Console.WriteLine("Reading from EDMX file...");

            // reading from edmx file
            var edmxPath = "./Sample_v3.edmx";

            using (var reader = XmlReader.Create(edmxPath))
            {
                const string basePath = "bin/Output/Models";
                Directory.CreateDirectory(basePath);

                // select from all entity sets
                var model       = EdmxReader.Parse(reader);
                var entityTypes = model.EntityContainers().First().EntitySets().Select(set => set.ElementType);
                foreach (var entityType in entityTypes)
                {
                    var entity = EntityDefinition.From(entityType);
                    File.WriteAllText(Path.Combine(basePath, $"{entityType.Name}.cs"), entity.NormalizeWhitespace().ToFullString());
                    Console.WriteLine($"{entityType.Name}");
                }
            }

            Console.WriteLine("All done.");
        }
示例#8
0
        private IEdmModel LoadModelFromString(string xmlString)
        {
            var tr     = new StringReader(MetaDataAsString);
            var model2 = EdmxReader.Parse(XmlReader.Create(tr));

            return(model2);
        }
示例#9
0
            public DefaultTestModel()
            {
                this.RepresentativeModel = EdmxReader.Parse(XElement.Parse(RepresentativeEdmxDocument).CreateReader());
                this.EntityContainer     = this.RepresentativeModel.EntityContainer;
                this.EntityContainer.Should().NotBeNull();
                this.EntityContainer.Name.Should().Be("Container");

                this.AddAction          = (IEdmAction)this.RepresentativeModel.FindDeclaredOperations("Test.Add").Single();
                this.OtherAction        = (IEdmAction)this.RepresentativeModel.FindDeclaredOperations("Test.Other").Single();
                this.RemoveBadCarAction = (IEdmAction)this.RepresentativeModel.FindDeclaredOperations("Test.RemoveBadCar").Single();

                this.Get1Function = (IEdmFunction)this.RepresentativeModel.FindDeclaredOperations("Test.Get1").Single();
                this.Get2Function = (IEdmFunction)this.RepresentativeModel.FindDeclaredOperations("Test.Get2").Single();
                var operations = this.RepresentativeModel.FindDeclaredOperations("Test.Get3").ToList();

                this.Get3FunctionOneParam = (IEdmFunction)operations[0];
                this.Get3FunctionNoParams = (IEdmFunction)operations[1];

                this.Get1FunctionImport = (IEdmFunctionImport)this.EntityContainer.FindOperationImports("Get1").Single();
                this.Get2FunctionImport = (IEdmFunctionImport)this.EntityContainer.FindOperationImports("Get2").Single();
                var get3Imports = this.EntityContainer.FindOperationImports("Get3").ToList();

                this.Get3FunctionImportWithOneParam = (IEdmFunctionImport)get3Imports[0];
                this.Get3FunctionImportWithNoParams = (IEdmFunctionImport)get3Imports[1];

                this.PersonType = this.RepresentativeModel.FindDeclaredType("Test.Person") as IEdmEntityType;
                this.PersonType.Should().NotBeNull();

                this.CarType = this.RepresentativeModel.FindDeclaredType("Test.Car") as IEdmEntityType;
                this.CarType.Should().NotBeNull();
            }
示例#10
0
        public OasisRelationshipChangesAcceptanceTests()
        {
            this.representativeModel = EdmxReader.Parse(XElement.Parse(RepresentativeEdmxDocument).CreateReader());
            var container = this.representativeModel.EntityContainer;

            this.entitySet1 = container.FindEntitySet("EntitySet1");
            this.entitySet2 = container.FindEntitySet("EntitySet2");
            this.entityType = this.representativeModel.FindType("Test.EntityType") as IEdmEntityType;

            this.entitySet1.Should().NotBeNull();
            this.entitySet2.Should().NotBeNull();
            this.entityType.Should().NotBeNull();

            this.navigation1          = this.entityType.FindProperty("navigation") as IEdmNavigationProperty;
            this.navigation2          = this.entityType.FindProperty("NAVIGATION") as IEdmNavigationProperty;
            nonKeyPrincipalNavigation = this.entityType.FindProperty("NonKeyPrincipalNavigation") as IEdmNavigationProperty;

            var derivedType = this.representativeModel.FindType("Test.DerivedEntityType") as IEdmEntityType;

            derivedType.Should().NotBeNull();
            this.derivedNavigation = derivedType.FindProperty("DerivedNavigation") as IEdmNavigationProperty;

            this.navigation1.Should().NotBeNull();
            this.navigation2.Should().NotBeNull();
            this.derivedNavigation.Should().NotBeNull();
        }
示例#11
0
        internal static object GetAnnotation(this IODataServiceContext context, params object[] customs)
        {
            if (false == (null != customs && customs.Count() <= 3))
            {
                return(null);
            }

            var serviceUri = customs[0] as Uri;
            var requestUri = customs[1] as Uri;
            var metadata   = customs[2] as IODataServiceMetadata;

            IEdmModel     edmModel     = EdmxReader.Parse(XmlReader.Create(serviceUri + "/$metadata"));
            IEdmEntitySet edmEntitySet = edmModel.EntityContainers()
                                         .First()
                                         .EntitySets()
                                         .FirstOrDefault(es =>
                                                         es.Name.ToLower() == requestUri.Segments.Last().ToLower() ||
                                                         requestUri.Segments.Last().ToLower().StartsWith(es.Name.ToLower() + "(")
                                                         );
            IEdmEntityType edmEntityType  = edmEntitySet.ElementType;
            ODataUriParser internalParser = new ODataUriParser(edmModel, serviceUri);

            var odataParser = new ODataParser()
            {
                EdmModel       = edmModel,
                EdmEntitySet   = edmEntitySet,
                EdmEntityType  = edmEntityType,
                InternalParser = internalParser,
                Metadata       = metadata,
            };

            return(odataParser);
        }
示例#12
0
        public static IEdmModel GetModel(this ConnectionProperties properties)
        {
            var uri = properties.Uri;

            uri += uri.EndsWith("/") ? "$metadata" : "/$metadata";

            IEdmModel model;

            var settings = new XmlReaderSettings
            {
                XmlResolver = new XmlUrlResolver
                {
                    Credentials = properties.GetCredentials(),
                    Proxy       = properties.GetWebProxy()
                },
                DtdProcessing = DtdProcessing.Parse
            };

            using (var reader = XmlReader.Create(uri, settings))
            {
                model = EdmxReader.Parse(reader);
            }

            return(model);
        }
示例#13
0
        public void ProvideOverloadToSupplyEntitySetConfiguration()
        {
            IEdmModel model  = null;
            Stream    stream = Client.GetStreamAsync(BaseAddress + "/odata/$metadata").Result;

            using (XmlReader reader = XmlReader.Create(stream))
            {
                model = EdmxReader.Parse(reader);
            }
            IEdmFunctionImport collection         = model.FindDeclaredEntityContainer("Container").FindFunctionImports("GetProductsByCategory").SingleOrDefault();
            IEdmEntityType     expectedReturnType = model.FindDeclaredType(typeof(ActionProduct).FullName) as IEdmEntityType;

            Assert.NotNull(expectedReturnType);
            Assert.NotNull(collection);
            Assert.True(collection.IsBindable);
            Assert.NotNull(collection.ReturnType.AsCollection());
            Assert.NotNull(collection.ReturnType.AsCollection().ElementType().AsEntity());
            Assert.Equal(expectedReturnType, collection.ReturnType.AsCollection().ElementType().AsEntity().EntityDefinition());

            IEdmFunctionImport single = model.FindDeclaredEntityContainer("Container").FindFunctionImports("GetSpecialProduct").SingleOrDefault();

            Assert.NotNull(single);
            Assert.True(single.IsBindable);
            Assert.NotNull(single.ReturnType.AsEntity());
            Assert.Equal(expectedReturnType, single.ReturnType.AsEntity().EntityDefinition());
        }
示例#14
0
        internal virtual IEdmModel LoadModelFromString()
        {
            var tr = new StringReader(MetaDataAsString);

            Model      = EdmxReader.Parse(XmlReader.Create(tr));
            EntitySets = GetEntitySets(Model);
            return(Model);
        }
示例#15
0
 private IEdmModel LoadModel()
 {
     using (var reader = new XmlTextReader(GetMetadataUri().ToString()))
     {
         IEdmModel model = EdmxReader.Parse(reader);
         return(model);
     }
 }
示例#16
0
        public ODataAdapter(ISession session, string protocolVersion, string metadataString)
            : this(session, protocolVersion)
        {
            var reader = XmlReader.Create(new StringReader(metadataString));

            reader.MoveToContent();
            Model = EdmxReader.Parse(reader);
        }
 public ODataModelAdapter(string protocolVersion, string metadataString)
     : this(protocolVersion)
 {
     using (var reader = XmlReader.Create(new StringReader(metadataString)))
     {
         reader.MoveToContent();
         Model = EdmxReader.Parse(reader);
     }
 }
示例#18
0
        public UserDefinedServiceContainer(Uri serviceRoot)
            : base(serviceRoot)
        {
            XmlReader reader = XmlReader.Create(new StringReader(edmModelString));

            edmModel = EdmxReader.Parse(reader);
            this.Format.LoadServiceModel = () => edmModel;
            this.Format.UseJson();
        }
 public void KeyAsSegmentEndToEndSmokeTestInJsonLight()
 {
     RunEndToEndSmokeTestWithClient(ctx =>
     {
         ctx.ResolveName = t => t.FullName;
         ctx.ResolveType = n => n.Contains("Customer") ? typeof(Customer) : null;
         ctx.Format.UseJson(EdmxReader.Parse(XmlReader.Create(ctx.GetMetadataUri().AbsoluteUri)));
     });
 }
        public void ReadSchema(string content)
        {
            //Microsoft.Data.Edm.Csdl.CsdlReader.TryParse()
            //System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();

            using (var reader = System.Xml.XmlReader.Create(new System.IO.StringReader(content))) {
                var edmModel = EdmxReader.Parse(reader);
                //edmModel.EntityContainers();
            }
        }
        public ModelSchema ReadSchema(System.IO.StreamReader streamReader)
        {
            //Microsoft.Data.Edm.Csdl.CsdlReader.TryParse()
            //System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();

            using (var reader = System.Xml.XmlReader.Create(streamReader)) {
                var edmModel = EdmxReader.Parse(reader);
                return(this.ConvertSchema(edmModel));
                //edmModel.EntityContainers();
            }
        }
示例#22
0
        public CsdlParModel()
        {
            #region parse Model
            StringBuilder builder = new StringBuilder();
            TextWriter    tw      = null;
            try
            {
                tw = new StringWriter(builder);
                using (var xw = XmlWriter.Create(tw))
                {
                    IEnumerable <EdmError> errors;
                    EdmxWriter.TryWriteEdmx(BaseModel, xw, EdmxTarget.OData, out errors);
                }
            }
            catch (Exception)
            {
                if (tw != null)
                {
                    tw.Dispose();
                }
            }

            TextReader tr = null;
            try
            {
                tr = new StringReader(builder.ToString());
                using (var xr = XmlReader.Create(tr))
                {
                    Model = EdmxReader.Parse(xr);
                }
            }
            catch (Exception)
            {
                if (tr != null)
                {
                    tr.Dispose();
                }
            }

            Debug.Assert(Model != null);
            #endregion

            Person = Model.FindEntityType("NS.Person");
            Debug.Assert(Person != null);

            PersonSet = Model.FindDeclaredEntitySet("PersonSet");
            Debug.Assert(PersonSet != null);

            PersonNavPetCon = Person.GetNavigationProperty("NavPetCon");
            Debug.Assert(PersonNavPetCon != null);

            PersonNavPetUnknown = Person.GetNavigationProperty("NavPetUnknown");
            Debug.Assert(PersonNavPetUnknown != null);
        }
示例#23
0
 /// <summary>
 /// Builds an Entity Data Model (EDM) from an
 /// existing <see cref="DbContext"/> created using Code-First.
 /// Use <see cref="GetModelFirstEdm"/> for a Model-First DbContext.
 /// </summary>
 /// <typeparam name="T">Type of the source <see cref="DbContext"/></typeparam>
 /// <param name="dbContext">Concrete <see cref="DbContext"/> to use for EDM generation.</param>
 /// <returns>An XML <see cref="IEdmModel"/>.</returns>
 static IEdmModel GetCodeFirstEdm <T>(this T dbContext) where T : DbContext
 {
     using (var stream = new MemoryStream()) {
         using (var writer = XmlWriter.Create(stream)) {
             System.Data.Entity.Infrastructure.EdmxWriter.WriteEdmx(dbContext, writer);
         }
         stream.Position = 0;
         using (var reader = XmlReader.Create(stream)) {
             return(EdmxReader.Parse(reader));
         }
     }
 }
示例#24
0
        /// <summary>
        /// Checks whether the specified document contains valid metadata and
        /// returns a loaded <see cref="IEdmModel"/>.
        /// </summary>
        /// <param name="document">Document to validate.</param>
        /// <returns>The loaded <see cref="IEdmModel"/>.</returns>
        public static IEdmModel IsValidMetadata(XPathDocument document)
        {
            var reader = document.CreateNavigator().ReadSubtree();
            var model  = EdmxReader.Parse(reader);
            IEnumerable <EdmError> errors;

            if (!model.Validate(out errors))
            {
                throw new TestFailedException(string.Join(Environment.NewLine, errors.Select(e => e.ToString())));
            }

            return(model);
        }
示例#25
0
        public void ValidateActionImportMissingActionAttributeShouldReturnError()
        {
            const string errorDocument = @"<edmx:Edmx Version=""4.0"" xmlns:edmx=""http://docs.oasis-open.org/odata/ns/edmx"">
  <edmx:DataServices>
    <Schema Namespace=""Test"" xmlns=""http://docs.oasis-open.org/odata/ns/edm"">
      <EntityContainer Name=""Container"">
        <ActionImport Name=""Add"" />
      </EntityContainer>
    </Schema>
  </edmx:DataServices>
</edmx:Edmx>";
            Action       test          = () => EdmxReader.Parse(XElement.Parse(errorDocument).CreateReader());

            test.ShouldThrow <EdmParseException>().WithMessage(Strings.XmlParser_MissingAttribute("Action", "ActionImport"), ComparisonMode.Substring);
        }
示例#26
0
        public void ParsingInvalidXmlWithMultipleEntityContainersShouldThrow()
        {
            string EdmxwithMultipleEntityContainers = @"<edmx:Edmx Version=""4.0"" xmlns:edmx=""http://docs.oasis-open.org/odata/ns/edmx"">
  <edmx:DataServices>
    <Schema Namespace=""Test"" xmlns=""http://docs.oasis-open.org/odata/ns/edm"">
      <EntityContainer Name=""Container1"" />
      <EntityContainer Name=""Container2"" />
    </Schema>
  </edmx:DataServices>
</edmx:Edmx>";
            Action parseAction = () => EdmxReader.Parse(XElement.Parse(EdmxwithMultipleEntityContainers).CreateReader());

            parseAction.ShouldThrow <EdmParseException>().WithMessage(
                Strings.CsdlParser_MetadataDocumentCannotHaveMoreThanOneEntityContainer, ComparisonMode.Substring).And.Errors.Should().HaveCount(1);
        }
示例#27
0
 private IEdmModel CodeFistModel(DbContext context)
 {
     using (var stream = new MemoryStream())
     {
         using (var writer = XmlWriter.Create(stream))
         {
             System.Data.Entity.Infrastructure.EdmxWriter.WriteEdmx(context, writer);
             writer.Close();
             stream.Seek(0, SeekOrigin.Begin);
             using (var reader = XmlReader.Create(stream))
             {
                 return(EdmxReader.Parse(reader));
             }
         }
     }
 }
示例#28
0
        public IEdmModel GetEdmModel()
        {
            using (MemoryStream stream = new MemoryStream())
            {
                using (XmlWriter writer = XmlWriter.Create(stream))
                {
                    System.Data.Entity.Infrastructure.EdmxWriter.WriteEdmx(this, writer);
                }

                stream.Position = 0;

                using (XmlReader reader = XmlReader.Create(stream))
                {
                    return(EdmxReader.Parse(reader));
                }
            }
        }
示例#29
0
        public IEdmModel LoadModel(Uri realm)
        {
            using (HttpClient client = new HttpClient())
            {
                var header = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", GetRawToken());
                client.DefaultRequestHeaders.Authorization = header;

                Console.WriteLine("\t{0} {1}", "GET", realm.ToString() + "$metadata");

                HttpResponseMessage response = client.GetAsync(realm.ToString() + "$metadata").Result;
                var stream = response.Content.ReadAsStreamAsync().Result;
                using (var reader = XmlReader.Create(stream))
                {
                    IEdmModel model = EdmxReader.Parse(reader);
                    _modelLoadCompleteEvent.Set();
                    return(model);
                }
            }
        }
示例#30
0
        /// <summary>
        /// Builds an Entity Data Model (EDM) from an
        /// existing <see cref="DbContext"/> created using Code-First.
        /// Use <see cref="GetModelFirstEdm"/> for a Model-First DbContext.
        /// </summary>
        /// <typeparam name="T">Type of the source <see cref="DbContext"/></typeparam>
        /// <param name="dbContext">Concrete <see cref="DbContext"/> to use for EDM generation.</param>
        /// <returns>An XML <see cref="IEdmModel"/>.</returns>
        static IEdmModel GetCodeFirstEdm <T>(this T dbContext) where T : DbContext
        {
            using (var stream = new MemoryStream())
            {
                using (var writer = XmlWriter.Create(stream))
                {
                    System.Data.Entity.Infrastructure.EdmxWriter.WriteEdmx(dbContext, writer);
                }

                stream.Position = 0;

                // Add readonly properties
                // This way of adding new properties actually work, but these properties are not necessary anymore
                // So keep them as a sample
                var edmx = System.Xml.Linq.XDocument.Load(stream);
                RemoveProperty(edmx, "User", "SecurityStamp");
                RemoveProperty(edmx, "User", "PasswordHash");
                //AddReadonlyProperty(edmx, "ResourcePool", "OtherUsersResourcePoolRateTotal", "Decimal", true);
                //AddReadonlyProperty(edmx, "ResourcePool", "OtherUsersResourcePoolRateCount", "Int32", false);
                //AddReadonlyProperty(edmx, "ElementField", "OtherUsersIndexRatingTotal", "Decimal", true);
                //AddReadonlyProperty(edmx, "ElementField", "OtherUsersIndexRatingCount", "Int32", false);
                //AddReadonlyProperty(edmx, "ElementCell", "OtherUsersNumericValueTotal", "Decimal", true);
                //AddReadonlyProperty(edmx, "ElementCell", "OtherUsersNumericValueCount", "Int32", false);

                /* UNCOMMENT THIS IN CASE YOU WANT TO SAVE AND INSPECT THE EDMX FILE */
                //stream.Position = 0;
                //var edmxDocument = new System.Xml.XmlDocument();
                //edmxDocument.Load(stream);
                //edmxDocument.Save(@"D:\test.xml");

                using (var reader = edmx.CreateReader())
                {
                    return(EdmxReader.Parse(reader));
                }

                // Old part
                //using (var reader = XmlReader.Create(stream))
                //{
                //    return EdmxReader.Parse(reader);
                //}
            }
        }