Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用IEdmModel将EntitySet名称解析为EntityName(产品->;产品)_C#_.net_Odata_Wcf Data Services - Fatal编程技术网

C# 使用IEdmModel将EntitySet名称解析为EntityName(产品->;产品)

C# 使用IEdmModel将EntitySet名称解析为EntityName(产品->;产品),c#,.net,odata,wcf-data-services,C#,.net,Odata,Wcf Data Services,我正在实体框架之上使用OData服务 var uri = new Uri("http://localhost:9876/Service.svc"); var context = new DataServiceContext(uri, , DataServiceProtocolVersion.V3); var model = EdmxReader.Parse( XmlReader.Create(context.GetMetadataUri().AbsoluteUri) ); context

我正在实体框架之上使用OData服务

var uri = new Uri("http://localhost:9876/Service.svc");
var context = new DataServiceContext(uri, , DataServiceProtocolVersion.V3);
var model = EdmxReader.Parse(
    XmlReader.Create(context.GetMetadataUri().AbsoluteUri)
);
context.Format.UseJson(model);
现在我需要从EntitySet名称中找出实体名称

我的实体称为
产品
客户
,但
实体集
的名称可以是
产品
客户集
或其他名称


由于我已经加载了
IEdmModel
,并且信息位于
$metadata
中,有没有办法从IEdmModel解析实体名称

由于我还没有找到提取所需信息的方法,我最终创建了自己的解决方案

首先,我将元数据xml读入一个字符串,以便只对服务进行一次往返。 然后,我从字符串中创建我的
IEdmModel
,并创建我自己的类,该类从元数据xml中提取所有信息

    var client = new WebClient();
    var metadata = client.DownloadString(metadataUri);
    var model = CreateModel(metadata);
    var schema = CreateSchema(metadata);

    private static IEdmModel CreateModel(string metadata)
    {
        using (var reader = new StringReader(metadata))
        using (var xmlReader = XmlReader.Create(reader))
        {
            return EdmxReader.Parse(xmlReader);
        }
    }

    private static Schema.Schema CreateSchema(string metadata)
    {
        using (var reader = new StringReader(metadata))
        using (var xmlReader = XmlReader.Create(reader))
        {
            var root = XElement.Load(xmlReader);
            return SchemaBuilder.GetSchema(root);
        }
    }
下面是从元数据中读取模式的代码,希望有人会发现这很有用。我没有包括我使用的类,但它们只是没有代码的POCO

    public static Schema GetSchema(XElement root)
    {

        XNamespace edmx = root.GetNamespaceOfPrefix("edmx");
        XNamespace edm = root.Element(edmx + "DataServices").Elements().First().GetDefaultNamespace();

        var result = from s in root.Element(edmx + "DataServices").Elements(edm + "Schema")
                     select new
                     {
                         Namespace = (string)s.Attribute("Namespace"),
                         EntityTypes = from e in s.Elements(edm + "EntityType")
                                       select new EntityType
                                       {
                                           Name = (string)e.Attribute("Name"),
                                           Key = from k in e.Element(edm + "Key").Elements(edm + "PropertyRef")
                                                 select (string)k.Attribute("Name"),
                                           Properties = from p in e.Elements(edm + "Property")
                                                        select new Property
                                                        {
                                                            Name = (string)p.Attribute("Name"),
                                                            Type = (string)p.Attribute("Type"),
                                                            Nullable = (bool)p.Attribute("Nullable", true),
                                                            MaxLength = (string)p.Attribute("MaxLength"),
                                                            FixedLength = (bool)p.Attribute("FixedLength", false),
                                                        },
                                           NavigationProperties = from p in e.Elements(edm + "NavigationProperty")
                                                                  select new NavigationProperty
                                                                  {
                                                                      Name = (string)p.Attribute("Name"),
                                                                      Relationship = (string)p.Attribute("Relationship"),
                                                                      ToRole = (string)p.Attribute("ToRole"),
                                                                      FromRole = (string)p.Attribute("FromRole"),
                                                                  }
                                       },
                         Associations = from a in s.Elements(edm + "Association")
                                        select new Association
                                        {
                                            Name = (string)a.Attribute("Name"),
                                            Ends = from et in a.Elements(edm + "End")
                                                   select new AssociationEnd
                                                   {
                                                       Type = (string)et.Attribute("Type"),
                                                       Role = (string)et.Attribute("Role"),
                                                       Multiplicity = (string)et.Attribute("Multiplicity"),
                                                   }
                                        },
                         AssociationSets = from @as in s.Elements(edm + "EntityContainer").Elements(edm + "AssociationSet")
                                           select new AssociationSet
                                           {
                                               Name = (string)@as.Attribute("Name"),
                                               Association = (string)@as.Attribute("Association"),
                                               Ends = from r in @as.Elements(edm + "End")
                                                      select new AssociationSetEnd
                                                      {
                                                          Role = (string)r.Attribute("Role"),
                                                          EntitySet = (string)r.Attribute("EntitySet"),
                                                      },
                                           },
                        EntitySets = from @es in s.Elements(edm + "EntityContainer").Elements(edm + "EntitySet")
                                     select new EntitySet
                                            {
                                                Name = (string)@es.Attribute("Name"),
                                                EntityType = (string)@es.Attribute("EntityType"),
                                            },

                     };

        return new Schema
        {
            Namespace = result.First().Namespace,
            EntityTypes = result.SelectMany(x => x.EntityTypes).ToDictionary(x => x.Name),
            Associations = result.SelectMany(x => x.Associations).ToDictionary(x => x.Name),
            AssociationSets = result.SelectMany(x => x.AssociationSets).ToDictionary(x => x.Name),
            EntitySets = result.SelectMany(x => x.EntitySets).ToDictionary(x => x.Name),
        };
    }