C# 并非所有通过实体框架WCF调用传输的数据都包括
我有一个从实体框架返回数据的WCF服务。它返回的对象是ShippingLine,它是订单的子项OrderLine的子项 在我的WCF服务中,我有以下代码:C# 并非所有通过实体框架WCF调用传输的数据都包括,c#,.net,wcf,entity-framework,entity-framework-4,C#,.net,Wcf,Entity Framework,Entity Framework 4,我有一个从实体框架返回数据的WCF服务。它返回的对象是ShippingLine,它是订单的子项OrderLine的子项 在我的WCF服务中,我有以下代码: var shippingLine = _dbContext.ShippingLines .Include(l => l.OrderLine) .Include(l => l.OrderLine.O
var shippingLine = _dbContext.ShippingLines
.Include(l => l.OrderLine)
.Include(l => l.OrderLine.Order)
.Include(l => l.OrderLine.Order.Customer)
.Include(l => l.OrderLine.Order.Customer.CustomerAddress)
.Include(l => l.OrderLine.Order.Customer.CustomerAddress.Country)
.Include(l => l.OrderLine.Order.Customer.CustomerAddress.State)
.Include(l => l.OrderLine.OrderLineOptions)
.Include(l => l.OrderLine.OrderLineOptions.First().Option)
.Include(l => l.OrderLine.OrderLineOptions.First().Option.ExternalPrintingSystemMapping)
.Include(l => l.OrderLine.OrderLineStatus)
.Include(l => l.TrackingNumbers)
.Include(l => l.ShippingMethod)
.Include(l => l.ShippingMethod.ShippingRates)
.Include(l => l.ShippingBox)
.Include(l => l.BulkMailingAsset)
.Include(l => l.BulkPostageType)
.FirstOrDefault<ShippingLine>(line => line.Id == id);
然后,我将该发货行返回给MVC控制器,然后该控制器尝试访问OrderLine对象上的订单。出于某种原因,尽管OrderLine对象上的每个属性都为null或设置为其默认值。因此,我无法访问以下代码中的Order对象,因为Order为null:
line.OrderLine.Order.Customer.CustomerAddress;
我正在使用4.0框架和EF4自跟踪实体
我确信它包含订单行和订单信息,因为在调试器中,我可以在将订单行和订单返回到客户机之前正确地看到订单行和订单
但是,当订单到达客户机时,所有订单行属性都为null或默认值,并且订单不存在。所有其他的都很好
这些关系是订单(一)到订单行(多),订单行(一)到发货行(多)
我已经试过了。。。
1.正在更新客户端上的我的服务引用。
2.在客户端上删除并重新创建我的服务引用。
3.在客户端上打开详细的WCF跟踪。我在跟踪中没有发现任何问题
知道为什么会这样删除包含的对象吗?这是我的客户端web.config:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IMyService" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxBufferSize="2147483646" maxBufferPoolSize="2147483646" maxReceivedMessageSize="2147483646" messageEncoding="Mtom">
<readerQuotas maxDepth="256" maxStringContentLength="5242880" maxArrayLength="2147483646" maxBytesPerRead="4096" maxNameTableCharCount="2147483646" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost/MyService/systemservice.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyService" contract="MyService.IMyService" name="BasicHttpBinding_IMyService" />
</client>
这是我的web服务web.config:
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
<services>
<service name="MyApi.MyService">
<endpoint behaviorConfiguration="MyServiceBehavior" binding="basicHttpBinding" bindingConfiguration="MyServiceBindingConfiguration"
contract="MyApi.IMyService"/>
<host>
<timeouts openTimeout="00:05:00"/>
</host>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="MyServiceBindingConfiguration" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
maxBufferSize="2147483646" maxBufferPoolSize="2147483646" maxReceivedMessageSize="2147483646" messageEncoding="Mtom">
<readerQuotas maxDepth="256" maxStringContentLength="5242880" maxArrayLength="2147483646" maxBytesPerRead="4096" maxNameTableCharCount="5242880"/>
</binding>
<binding name="ServiceSoap" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
<message clientCredentialType="UserName" algorithmSuite="Default"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<!-- productionProxyAddress https://api.authorize.net/soap/v1/Service.asmx -->
<endpoint address="https://apitest.authorize.net/soap/v1/Service.asmx" binding="basicHttpBinding" bindingConfiguration="ServiceSoap"
contract="AuthorizeNet.ServiceSoap" name="ServiceSoap"/>
</client>
<behaviors>
<endpointBehaviors>
<behavior name="MyServiceBehavior">
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
我认为包含集合的EF include lambda语法是
.Include(l => l.OrderLine.OrderLineOptions.Select(ol => ol.Option))
而不是
.Include(l => l.OrderLine.OrderLineOptions.First().Option)
我通过引用一个我们称之为ServiceInterface的项目(而不是服务)解决了这个问题。这个项目的唯一目的是对我们的web服务进行服务引用。因为我们在多个地方引用了服务,所以在添加新方法时更容易。您只需在一个位置更新服务引用
我唯一能想到的是,由于某种原因,当我添加服务引用时,在我的MVC站点项目上创建的代理类没有正确创建。无论我更新它多少次或重新创建服务引用,它都不会工作。使用一个包含服务引用的项目,我知道它起了作用。您是否尝试更改
属性的值?如果设置为1,则只会序列化根级别。从我所看到的情况来看,代码或web.config中没有设置根级别,默认值应该可以,除非您了解其他相关信息。我刚刚为客户端和服务添加了web.configs。maxItemInObjectGraph的默认值是MaxValue,应该可以;-)你能试着切换到
而不是文本(这是basichttpbinding的默认设置)吗?我想我需要创建一个自定义绑定来实现这一点。以前没有这样做过,除了使用binaryMessageEncoding之外,自定义绑定模仿basichttpbinding会是什么样子?试试这个:
,然后在您的端点上:binding=“customBinding”bindingConfiguration=“BinaryHttpBinding”
我试过了,但它不适用于我们用于单元测试目的的自定义Include方法。我已经在问题中添加了这些代码。
.Include(l => l.OrderLine.OrderLineOptions.Select(ol => ol.Option))
.Include(l => l.OrderLine.OrderLineOptions.First().Option)