Poco Родитель-ребенок потерял связь с клиентом - PullRequest
1 голос
/ 29 ноября 2011

У меня есть такой сценарий:

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 элементов)

На стороне сервера все в порядке, прежде чем мой веб-сервис отправит данные клиенту

Я получил структурукак это:

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)
  • стандартный шаблон Microsoft POCO
  • EF4.

1 Ответ

1 голос
/ 14 декабря 2011

Я обнаружил, в чем проблема: XMLSerializer при сериализации свойств помещает их в XML, по-видимому, в случайном порядке (возможно, он следует некоторому порядку, который он получает от Datamodel edmx, я не исследовал это), поэтому я получил этот сценарий вXML, сгенерированный XMLSerializer:

<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 код пытается установить PARENTID для CHILD_Entity до того, как будет установлено PARENT_Entity.PARENT_ID и после того, как будет запущен SETTER CHILD_Entity.PARENT_Entity.таким образом, мы получили странный сценарий, в котором значение CHILD_Entity.PARENT имеет значение, но CHILD_Entity.Parent.PARENT_ID = NULL, поскольку DESERIALIZER все еще не обработал это свойство из XML

. Чтобы решить проблемы такого рода, мне пришлось изменить POCO.Шаблон таким образом:

  1. Установите переменную счетчика int propertyPosCounter = 1;

  2. Укажите ORDER при настройке DataMemberAttribute [DataMemberAttribute(Order = <#=propertyPosCounter.ToString()#>)]

  3. Увеличение счетчика после этого propertyPosCounter +=1;

  4. ПОВТОР Этот процесс для каждого Примитивных свойств - Комплексных свойств - Свойства навигации , чтобы мы всегда получали правильный порядок в сгенерированном XML для десериализации размера клиента с помощью POCO и его концепции исправления

После этой настройки для шаблона POCO.tt, который я решаютакого рода конфликты и проблем не возникает Сериализация -> Десериализация мои структуры данных передаются из моей службы WCF в мое клиентское приложение, в результате получается серия XMLlized is:

<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>

Я пытался быть настолько ясным, насколько это возможно, но сценарий не тривиален, поэтому, если кто-то нуждается в разъяснении, не стесняйтесь спрашивать его, я постараюсь ответить, как только смогу.

Надеюсь, что этот пост может помочь кому-то еще:)

С уважением, Луиджи Мартинес Бьянки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...