2009-10-29 5 views
4

Sans entrer dans si cela est une bonne ou une mauvaise idée:Les objets Linq à sql sont-ils sérialisables pour l'état de session?

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

[EDIT] Je reçois actuellement l'erreur suivante et posé cette question parce que je pense que les objets LINQ to SQL:

Impossible de sérialiser l'état de session. En mode 'StateServer' et 'SQLServer', ASP.NET va sérialiser 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'états de session personnalisé en mode "Personnalisé". [/ EDIT]

par exemple.

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

où:

  • Zoo, Lion, Tigre, Elephant sortent tous 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"/> 

Répondre

1

Sérialisez les utiliser DataContractSerializer avant de les stocker en session ou toute autre chose qui peut vouloir sérialiser ... Recently discussed here:

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

+0

Merci de m'avoir donné l'idée.J'avais supposé que si les classes étaient sérialisables, alors elles étaient * serializable *, comme dans le XmlSerializer aurait fonctionné. À la fin, j'ai enveloppé et XmlTextWriter autour d'un MemoryStream, puis utilisé le DataContractSerializer pour sérialiser dans le XmlTextWriter. Après cela, le tampon octet [] du flux de mémoire pourrait être sérialisé et stocké hors processus. Je n'aime vraiment pas ce kludge d'un correctif, mais j'ai été soutenu dans un coin par quelqu'un d'autre conception en s'appuyant sur l'état au lieu d'un motif de "replay". –

1

Je voudrais crois que vous auriez besoin de marquer vos objets comme étant sérialisables. Je ne suis pas sûr qu'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 donner l'attribut Serializable.

+0

Merci. Cela semblait être une idée prometteuse, mais malheureusement cela ne fonctionne pas. Dans un sens j'étais content :) parce que ce serait aussi une vraie douleur pour un grand modèle avec beaucoup de classes. Il m'a harcelé que cet article: "Comment: rendre les entités sérialisables (LINQ à SQL)" http://msdn.microsoft.com/en-us/library/bb546185.aspx implique qu'ils doivent être sérialisables. –

4

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

La nécessité ci-après pour marquer comme [NonSerialized]:

  • EntityRef
  • EntitySet
  • Tous les événements (vous aurez besoin de penser hors des sentiers battus pour ce faire, l'exercice pour le lecteur)

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