0

J'ai deux entités gérées NHibernate qui ont un-à-plusieurs bidirectionnelle:Comment sérialiser/désérialiser une entité NHibernate qui a des références à d'autres objets?

public class Storage 
{ 
    public virtual string Name { get; set; } 
    public virtual IList<Box> Boxes { get; set; } 
} 

public class Box 
{ 
    public virtual string Box { get; set; } 
    [DoNotSerialize] public virtual Storage ParentStorage { get; set; } 
} 

Un Storage peut contenir beaucoup Boxes, et un Box Appartient toujours dans un Storage. Je veux modifier un nom Box's, donc je l'envoie au client en utilisant JSON. Notez que je ne sérialiser ParentStorage parce que je ne change pas qui le stockage est dans.

Le client modifie le nom et envoie le Box retour JSON. Le serveur le désérialise en une entité Box.

Le problème est que la propriété ParentStorage est null. Lorsque j'essaie d'enregistrer le Box dans la base de données, il met à jour le nom, mais supprime également la relation au Storage.

Comment sérialiser et désérialiser correctement une entité comme Box, tout en conservant la taille de données JSON au minimum?

Répondre

2

Je vous recommande d'envoyer un DTO au client à des fins d'affichage (et il devrait contenir l'ID de base de données unique). Envoyez ensuite le boxId + le nouveau nom au serveur depuis le client (il n'est pas nécessaire de renvoyer le DTO entier). Le serveur peut effectuer une recherche de base de données en utilisant l'ID pour obtenir l'objet boîte, mettre à jour le champ de nom à celui envoyé par le client et enregistrer la boîte dans la base de données.

Dans ce scénario, il n'est pas nécessaire de sérialiser un objet NHibernate, cela ajoute simplement beaucoup de complexité et aucune valeur.

0

Je suppose que ParentStorage est null car il est chargé paresseusement. Le configurer pour être lu avec impatience ou forcer une lecture en appelant le getter avant la sérialisation peut aider à s'assurer que le stockage est sérialisé, et en fonction de votre schéma d'ID cela peut fonctionner (je ne sais pas avec certitude). Les gains de la sérialisation dans ce cas semblent minimes et peuvent avoir des conséquences inattendues à mesure que les classes Box et Storage évoluent. Il semble plus simple d'envoyer une seule chaîne pour le nom, de charger la boîte, de définir la chaîne et de sauvegarder cet objet. Vous n'avez donc plus à vous soucier des optimisations qu'Hibernate effectue en dessous.

+1

C'est faux, les relations chargées paresseusement ne sont pas nulles, elles sont assignées aux proxies. –

Questions connexes