Domanda

Senza capire se questa è una buona o una cattiva idea:

È possibile archiviare un oggetto dominio LINQ-to-SQL nella sessione ASP.NET, quando la sessione è fuori processo ?

[EDIT] Attualmente sto ricevendo il seguente errore e ho posto questa domanda perché sospetto gli oggetti LINQ-to-SQL:

Impossibile serializzare lo stato della sessione. In modalità "StateServer" e "SQLServer", ASP.NET serializzerà gli oggetti stato sessione e di conseguenza non sono consentiti oggetti non serializzabili o oggetti MarshalByRef. La stessa restrizione si applica se la serializzazione simile viene eseguita dall'archivio stato sessione personalizzato in modalità "Personalizzata". [/ EDIT]

per es.

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

dove:

  • Zoo, Lion, Tiger, Elephant escono tutti da ZooDataContext

e il file web.config contiene

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

Soluzione

Serializzali utilizzando il datacontractserializer prima di archiviarli in sessione o qualsiasi altra cosa che potrebbe voler serializzare ... Recentemente discusso qui :

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

Altri suggerimenti

Per usare il formattatore binario (come credo SessionState, credo), dovresti generare tu stesso il tuo codice dal DBML (lo faccio attualmente con un modello Linq2Sql T4).

È necessario contrassegnare come [Non serializzato] :

  • EntityRef
  • EntitySet
  • Tutti gli eventi (per fare ciò, dovrai pensare fuori dagli schemi, allenarti per il lettore)

Anche la logica del costruttore deve essere spostata su OnCreated . Devi anche assicurarti che OnCreated venga chiamato durante la deserializzazione in modo che l'oggetto possa tornare utile. Viene eseguito con l'attributo [OnDeserializing] .

Credo che dovresti contrassegnare i tuoi oggetti come serializzabili. Non sono sicuro che ci sia un modo per farlo per tutti gli oggetti generati, ma per quelli che stai mettendo in sessione, potresti creare una classe parziale (ad es. Di Lion) e assegnarle l'attributo Serializable.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top