0

当一个 Drupal 应用程序使用我们继承的 WCF 服务时,它会发送一个 xml,该 xml 应该会产生一个实体框架参数。在一些架构更改后,我们更新了实体框架模型(edmx 文件)。问题是当客户端调用服务(使用与之前相同的代码)时,usageritem 参数没有正确反序列化。对该方法的调用如下:

<UpdateUsager xmlns="http://tempuri.org/">
<usageritem xmlns:a="http://schemas.datacontract.org/2004/07/CNVGestion.Domain" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" z:Id="i1">
<EntityKey xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" i:nil="true"/><a:ADR1>7 rue Diffonty</a:ADR1>  ....

接收此调用的方法具有以下标头:

 public string UpdateUsager(fUsagerItem usageritem, bool checkonly){

声明实体的 edmx 具有以下标头

<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
  <!-- EF Runtime content -->
  <edmx:Runtime>
    <!-- SSDL content -->
    <edmx:StorageModels>
    <Schema Namespace="FRONT.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">

我想知道这个 edmx 是在使用 sql server 2005 之前生成的,我们现在使用 sql server 2012 来更新它,我们只更改了 ProviderManifestToken="2005" 之间是否存在问题。谢谢你的帮助

4

1 回答 1

0

您的问题有点模棱两可-在输入您的方法之前对您的服务的调用是否失败,或者,如果不是,您的意思是参数为空还是它的某些属性为空?

如果是后者,我只能猜测从数据库更新实体框架模型,改变了fUsagerItem类中的属性顺序。您可以手动检查服务的 WSDL 引用的 .xsd 文件,并查看 WCF 对 XML 的期望。使用属性更改属性的序列化顺序[DataMember(Order = ?)],尽管您必须将它们放在设计器生成的类中(这是一个坏主意)。

一般认为,您不应该在 Web 服务中直接使用实体框架对象,尤其是当您从其他框架(如 PHP)使用服务时。当您创建自己的数据传输对象时,您可以更好地控制序列化过程:您可以隐藏一些属性或引入数据库中不存在的新属性。如果您可以说服您的客户更改他们的实现,我建议您在您的服务中使用 DTO 类(AutoMapper 可以帮助很多将 DTO 对象映射到实体,反之亦然)。

于 2013-10-22T08:37:23.433 回答