Question

Sans préciser si c'est une bonne ou une mauvaise idée:

Est-il possible de stocker un objet de domaine LINQ-to-SQL dans la session ASP.NET lorsque la session est hors processus ?

[EDIT] J'obtiens actuellement l'erreur suivante et pose cette question parce que je suspecte les objets LINQ-to-SQL:

Impossible de sérialiser l'état de la session. En mode 'StateServer' et 'SQLServer', ASP.NET sérialise les objets d'état de session et, par conséquent, les objets non sérialisables ou les objets MarshalByRef ne sont pas autorisés. La même restriction s'applique si une sérialisation similaire est effectuée par le magasin d'état de session personnalisé en mode "Personnalisé". [/ EDIT]

par exemple

Session["Zoo"] = new Zoo() { 
                         new Lion(),
                         new Tiger(), 
                         new Elephant()
                  }

où:

  • Zoo, Lion, Tiger, Elephant sont tous issus d'un ZooDataContext

et le fichier web.config contient

<sessionState
       mode="StateServer"
       stateConnectionString="tcpip=127.0.0.1:42424"
       stateNetworkTimeout="10"
       sqlConnectionString="SqlStateConnectionString"
       sqlCommandTimeout="30"
       timeout="20"
       regenerateExpiredSessionId="true"/>
Était-ce utile?

La solution

Sérialisez-les à l'aide de datacontractserializer avant de les stocker dans une session ou quoi que ce soit d'autre qui pourrait vouloir sérialiser ... Récemment discuté ici :

http: / /social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/81c84ff4-059b-474f-9c69-b8c59027fd48

Autres conseils

Pour utiliser le formateur binaire (comme SessionState, je crois), vous auriez besoin de générer votre code vous-même à partir du DBML (je le fais actuellement avec un modèle Linq2Sql T4).

Les éléments suivants doivent être marqués comme [non sérialisés] :

  • EntityRef
  • EntitySet
  • Tous les événements (pour le faire, vous devez sortir des sentiers battus, faites de l'exercice pour le lecteur)

De plus, la logique du constructeur doit être déplacée vers OnCreated . Vous devez également vous assurer que OnCreated est appelé lors de la désérialisation afin que l'objet puisse à nouveau être utile. Cela se fait avec l'attribut [OnDeserializing] .

Je pense que vous devez marquer vos objets comme étant en série. Je ne sais pas s'il existe un moyen de le faire pour tous les objets générés, mais pour ceux que vous mettez en session, vous pouvez créer une classe partielle (par exemple, Lion) et lui attribuer l'attribut Serializable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top