当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">
我想知道在使用sql server 2005之前生成此edmx的事实与我们现在使用sql server 2012更新它并且我们仅更改了ProviderManifestToken="2005"的事实之间是否存在问题。谢谢你的帮助
你的问题有点模棱两可 - 在输入方法之前对服务的调用是否失败,或者,如果不是,你的意思是参数为 null 还是它的某些属性为 null?
如果是后者,我只能猜测从数据库更新实体框架模型,更改了类fUsagerItem
的属性顺序。您可以手动检查服务的 WSDL 引用的 .xsd 文件,并查看 WCF 对 XML 的期望。使用 [DataMember(Order = ?)]
属性更改属性的序列化顺序,但您必须将这些属性放在设计器生成的类中(这是一个坏主意(。
通常认为不应在 Web 服务中直接使用实体框架对象,尤其是当您从其他框架(如 PHP(使用服务时。创建自己的数据传输对象时,可以更好地控制序列化过程:可以隐藏某些属性或引入数据库中不存在的新属性。如果你能说服你的客户改变他们的实现,我建议在你的服务中使用DTO类(AutoMapper可以帮助很多将DTO对象映射到实体,反之亦然(。