JSON.NET et nHibernate Chargement différé des Collections
Est ce que quelqu'un à l'aide de JSON.NET avec nHibernate? J'ai remarqué que je reçois des erreurs quand j'essaye de charger une classe avec des enfants de collections.
- Pouvez vous s'il vous plaît poster des détails sur les erreurs que vous voyez?
- J'ai été faire "La méthode ou l'opération n'est pas mis en œuvre." et Liedman du correctif a fonctionné pour moi.
Vous devez vous connecter pour publier un commentaire.
J'ai été confrontée au même problème j'ai donc essayé d'utiliser @Liedman du code, mais l'
GetSerializableMembers()
n'a jamais été appelée pour la proxy de référence.J'ai trouvé une autre méthode pour remplacer:
Nous avons eu exactement ce problème, qui a été résolu avec l'inspiration de Handcraftsman réponse ici.
Le problème se pose à partir de JSON.NET être confus sur la façon de sérialiser NHibernate de classes proxy. Solution: sérialiser les proxy les instances de sa classe de base.
Une version simplifiée de Handcraftsman du code qui va comme ceci:
À mon humble avis, ce code a l'avantage de toujours en s'appuyant sur JSON.NET le comportement par défaut concernant les attributs personnalisés, etc. (et le code est beaucoup plus court!).
Il est utilisé comme cela
Remarque: Ce code a été écrit pour être utilisé avec NHibernate 2.1. Comme certains commentateurs l'ont souligné, il ne fonctionne pas hors de la boîte avec les versions ultérieures de NHibernate, vous devrez faire quelques ajustements. Je vais essayer de mettre à jour le code si jamais j'ai à faire avec les versions ultérieures de NHibernate.
- Je utiliser avec NHibernate Json.NET et a remarqué que je recevais inexplicable "__intercepteurs" propriétés dans mes objets sérialisés. Une recherche google s'est jusqu'à cette solution excellente par Lee Henson qui j'ai adapté pour travailler avec Json.NET Version 3.5 5 comme suit.
Pour l'utiliser il suffit de mettre une instance dans le ContractResolver propriété de votre JsonSerializer. La dépendance circulaire problème indiqué par jishi peut être résolu par la mise en au ReferenceLoopHandling propriété ReferenceLoopHandling.Les ignorer . Voici une méthode d'extension qui peut être utilisé pour sérialiser des objets à l'aide de Json.Net
Êtes-vous d'obtenir une circulaire de dépendance de l'erreur? Comment ignorer les objets de la sérialisation?
Depuis le chargement paresseux génère un proxy-objets, les attributs de votre classe-les membres ont sera perdu. J'ai rencontré le même problème avec Newtonsoft JSON-sérialiseur, depuis le proxy de l'objet n'ont pas le [JsonIgnore] attributs plus.
Vous voudrez probablement avides de charger la plupart de l'objet de sorte qu'il peut être sérialisé:
Une belle façon de le faire est d'ajouter un bool pour le constructeur (bool isFetchEager) de votre fournisseur de données méthode.
Je dirais que c'est un problème de conception à mon avis. Parce que NH rend les connexions à la base de données sous toutes et a procurations dans le milieu, il n'est pas bon pour la transparence de votre application pour sérialiser directement (et comme vous pouvez le voir Json.NET ne les aime pas du tout).
Vous ne devriez pas sérialiser les entités elles-mêmes, mais vous devez les convertir en "voir" des objets ou POCO ou DTO objets (ce que vous voulez l'appeler) et puis sérialiser ces.
La différence est que, alors que le NH entité peut avoir les proxys, les paresseux, les attributs, etc. Visualiser les objets sont des objets simples avec seulement primitives qui sont sérialisables par défaut.
Comment gérer les FKs?
Ma règle personnelle est:
Au niveau de l'entité: Personne de la classe et de l'Égalité des genres de la classe associée
Au niveau de la vue: vue subjective avec GenderId et GenderName propriétés.
Cela signifie que vous avez besoin pour développer vos propriétés dans les primitives lors de la conversion d'affichage des objets. De cette façon, vos objets json est plus simple et plus facile à manipuler.
Quand vous en avez besoin pour pousser les modifications à la DB, dans mon cas, j'utilise AutoMapper et faire un ValueResolver classe qui peut convertir votre nouveau Guid dans le Genre d'objet.
Mise à JOUR: Vérifier http://blog.andrewawhitaker.com/blog/2014/06/19/queryover-series-part-4-transforming/ d'un moyen d'obtenir le point de vue directement (AliasToBean) à partir de NH. Ce serait un coup de pouce dans la DB côté.