Poco亲子关系失去了客户端

时间:2011-11-29 16:33:38

标签: entity-framework-4 poco parent-child relationship

我有这种情况:

STRUCTURE : 
Entity A
 ChildEntity B

Assume this is data in my database 

A1
    (childs)
   B1
   B2
   B3
A2
    (childs)
   B4
   B5
   B6

使用linq to SQL。我想要一个B项列表 引用父母(A项目)

服务器端在我的Web服务将数据发送回客户端

之前就可以了

我得到了这样的结构:

B1
  A1
    (childs)
    B1
    B2
    B3
B2
  A1 (parent)
    (childs)
    B1
    B2
    B3
...
...

如果我尝试浏览图表,则所有项目似乎都在正确的位置。

客户端,在服务器序列化和客户端反序列化后我遇到这种情况:

B1
  A1 (parent)
    (childs)    
    B1
    B2
    B3
B2
  NULL
B3
  NULL
B4
  A2 (parent)
    (childs)
    B4
    B5
    B6
B5
  NULL
B6
  NULL

只有A个项目中的一个子项保留对父项的引用。我试着看看客户端和服务器端生成的XML,但找不到问题。

有人可以帮我理解为什么会这样吗? 或者有一个建议?

注意:
如果我尝试压缩列表服务器端,如byte[],并将其解压缩回客户端,将压缩对象转换为List<B>,所有项目也保持正确的关系,客户端,一切正常。所以我想这是序列化/反序列化中的一个问题

我正在使用:

  • 标准序列化(DataContractSerializer)
  • 标准微软POCO模板
  • EF4。

1 个答案:

答案 0 :(得分:1)

我发现问题出在哪里: 序列化属性时的XMLSerializer显然以随机顺序将它们放入XML中(可能它遵循从Datamodel edmx获得的某些顺序,我没有对它进行过调查) 所以我在XMLSerializer生成的XML中得到了这个场景:

<b:CHILD_Entity **z:Id="i1"** xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
    <b:CHILD_ID>008acd9a-2074-46b0-b73b-90b8c9123f6f</b:CHILD_ID>
    <b:ReasonInfo>HRC->PLC 11</b:ReasonInfo>
    <b:StartTime>2011-11-29T09:22:36.553</b:StartTime>
    <b:EndTime>2011-11-29T10:31:58.507</b:EndTime>
    <b:Quantity>0</b:Quantity>
    <b:PARENT_Entity z:Id="i2">
        <b:Description i:nil="true"></b:Description>
        <b:UtilizationType>COMMITTED</b:UtilizationType>
        <b:Reason>SETUP</b:Reason>
        <b:ReasonInfo></b:ReasonInfo>
        <b:CHILD_Entities>
            <b:**CHILD_Entity** **z:Ref="i1"**></b:CHILD_Entity>
            <b:**CHILD_Entity** **z:Id="i3"** xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
                <b:CHILD_ID>008acd9a-2074-46b0-b73b-90b8c9123f6f</b:CHILD_ID>
                <b:ReasonInfo>HRC->PLC 11</b:ReasonInfo>
                <b:StartTime>2011-11-29T09:22:36.553</b:StartTime>
                **<b:ProductionCapabilityUtilization z:Ref="i2"></b:ProductionCapabilityUtilization>**
                ***<b:PARENT_ID>32864280-fe68-4b21-8375-b57ae8bbd7e6</b:PARENT_ID>***
                ..........
            </b:CHILD_Entity>
            ..................

        </b:CHILD_Entities>
        **<b:PARENT_ID>32864280-fe68-4b21-8375-b57ae8bbd7e6</b:PARENT_ID>**
    </b:PARENT_Entity>
    ***<b:PARENT_ID>32864280-fe68-4b21-8375-b57ae8bbd7e6</b:PARENT_ID>***
    <b:PROP1>MLM</b:PROP1>
    <b:PROP2>MLM1</b:PROP2>
    <b:Reason>RUN</b:Reason>
</b:CHILD_Entity>
<b:**CHILD_Entity** **z:Ref="i3"** xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"></b:CHILD_Entity>

问题是,有时FIXUP生成的代码会在设置PARENT_Entity.PARENT_ID之前和触发CHILD_Entity.PARENT_Entity SETTER之后尝试在CHILD_Entity上设置PARENTID。 所以我们得到一个奇怪的情况,其中CHILD_Entity.PARENT有一个值,但CHILD_Entity.Parent.PARENT_ID = NULL,因为DESERIALIZER仍然没有从XML处理该属性

要解决这类问题,我必须以这种方式修改POCO模板:

  1. 设置计数器变量int propertyPosCounter = 1;

  2. 设置DataMemberAttribute时指定ORDER   [DataMemberAttribute(Order = <#=propertyPosCounter.ToString()#>)]

  3. propertyPosCounter +=1;

  4. 之后递增计数器
  5. 重复每个原始属性 - 复杂属性 - 导航属性的此过程 为了让我们在生成的XML中始终使用正确的顺序来使用POCO反序列化客户端大小,并且它的Fixup概念

  6. 在调整POCO.tt模板之后,我解决了这些冲突并且没有遇到任何问题 序列化 - &gt;反序列化从我的WCF服务传递到客户端应用程序的数据结构 XML序列化的结果是:

    <b:CHILD_Entity z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
        <b:CHILD_ID>008acd9a-2074-46b0-b73b-90b8c9123f6f</b:CHILD_ID>
        <b:PARENT_ID>32864280-fe68-4b21-8375-b57ae8bbd7e6</b:PARENT_ID>
        <b:PROP1>MLM</b:PROP1>
        <b:PROP2>MLM1</b:PROP2>
        <b:Reason>RUN</b:Reason>
        <b:ReasonInfo>HRC->PLC 11</b:ReasonInfo>
        <b:StartTime>2011-11-29T09:22:36.553</b:StartTime>
        <b:EndTime>2011-11-29T10:31:58.507</b:EndTime>
        <b:Quantity>0</b:Quantity>
        <b:PARENT_Entity z:Id="i2">
            <b:PARENT_ID>32864280-fe68-4b21-8375-b57ae8bbd7e6</b:PARENT_ID>
            <b:Description i:nil="true"></b:Description>
            <b:UtilizationType>COMMITTED</b:UtilizationType>
            <b:Reason>SETUP</b:Reason>
            <b:ReasonInfo></b:ReasonInfo>
            <b:CHILD_Entity>
                <b:CHILD_Entity z:Ref="i1"></b:CHILD_Entity>
                <b:**CHILD_Entity** **z:Id="i3"** xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
                    <b:CHILD_ID>008acd9a-2074-46b0-b73b-90b8c9123f6f</b:CHILD_ID>
                    ***<b:PARENT_ID>32864280-fe68-4b21-8375-b57ae8bbd7e6</b:PARENT_ID>***
                    <b:ReasonInfo>HRC->PLC 11</b:ReasonInfo>
                    <b:StartTime>2011-11-29T09:22:36.553</b:StartTime>
                    ..........
                    **<b:ProductionCapabilityUtilization z:Ref="i2"></b:ProductionCapabilityUtilization>**
                </b:CHILD_Entity>
            </b:CHILD_Entity>
        </b:PARENT_Entity>
    </b:CHILD_Entity>
    

    我试图尽可能清楚,但情节并非微不足道,所以如果有人需要澄清,请不要犹豫,我会尽快回答。

    希望这篇文章可以帮助别人:)

    此致 Luigi Martinez Bianchi