Entity Framework 4: более эффективный способ сохранения иерархической модели - PullRequest
1 голос
/ 07 ноября 2010

У меня есть эта сущность, у которой много связанных записей.Когда веб-клиент сохраняет данные, он отправляет иерархическую модель JSON.Модели выглядят так:

Product[].properties
         .SET1[].properties
         .SET2[].properties
                .SETA[].properties
                .SETA[].SETb[].properties

Когда я сохраняю это, у меня следующий поток:

Grab DB Product that matches current
Update Properties
Grab and loop through set 1 from DB
    If not found in "to save" set, delete item from set 1
    If found, update it
Grab and loop through set 2 from DB
    If not found in "to save" set, delete item from set 2
    If found, update it
    While we are in Set 2, grab all Set A from DB
        If not found in "to save" set, delete it from set A
        If found, update it
        While we are in Set A, grab all Set b in DB
            If not found in "to save" set, delete it from set b
            If found, update it

Now go back through and insert any in local set not in DB

Это должен быть худший алгоритм обновления, который я когда-либо видел.У кого-нибудь есть лучший код или ссылки, которые могут быть немного проще?В настоящее время используется C #

1 Ответ

1 голос
/ 07 ноября 2010

Что вам нужно сделать, это найти способ получить все записи в одном запросе.Вы можете сделать это, используя пути, как поля, которые представляют иерархию.Примером этого может быть:

  • Продукт 1 с кодом PROD1

    • Свойство 1 с кодом PROD1-PROP1

    • Свойство 2 с кодом PROD1-PROP2

      • Свойство 1 множества 1 с кодом PROD1-SET1-PROP1

      • Свойство 2набора 1 с кодом PROD1-SET1-PROP2

и т. д.

Теперь вы можете получить все свойства пополучить все свойства, начиная с пути "PROD1-".Затем, после того как вы получите все свойства продукта 1 за один раз, вы можете выполнить все мутации в памяти и сохранить все изменения в одном пакете.

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