Ravendb: Accès à l'instance de base de données pendant la conversion de documents
-
11-12-2019 - |
Question
J'ai besoin d'aide sur Raven DB et son API C #. Je veux faire une "commande par" avec une requête LINQ (avec la mise en œuvre de Linq à Raven).Pour ce faire, je dois créer un index pour réaliser cette action.Mon schéma est actuellement normalisé, mais je veux le dénormaliser afin d'ajouter une propriété personnalisée dedans.
Alors, j'ai:
entité A:
- de la propriété
- L'ID d'une entité B
En fait, je veux simplement commander mon comme une propriété B.Donc, je veux dénormaliser mon A pour inclure la propriété B.
Donc, une évolution du schéma est possible avec Ravendb, mais afin de définir la propriété B dans une mesure, je dois charger le B lors de la conversion de l'A. et il semble impossible en fonction de la documentation.
Je ne veux pas construire un programme effrayant qui ira déterrera sur chacun A à charger BS mais je ne vois pas une autre solution.
aucune idée?
Merci pour votre temps :). Julien
La solution
Vous ne devez pas écrire un programme effrayant, mais un projet de migrations robustes qui tiendra un tas de scripts de migration utiles.Un script simple comme le ci-dessous fera le travail pour vous:
public void LoadAndSaveWithDenormalizedProperty()
{
using (var session = store.OpenSession())
{
int skip = 0;
const int take = 24;
while (true)
{
var items = session.Query<ItemA>()
.Customize(customization => customization.Include(x => x.ItemBId))
.Skip(skip)
.Take(take)
.ToList();
skip += items.Count;
foreach (item in items)
{
item.DenormalizedProperty =
session.Load<ItemB>(item.ItemBId).PropertyToDenormalize;
}
session.SaveChanges();
if (items.Count == 0)
break;
}
}
}