Pergunta

Sem entrar se isso é uma boa ou má idéia:

É possível armazenar um objeto de domínio LINQ to SQL na sessão ASP.NET, quando a sessão é out-of-process ?

[EDIT] Atualmente estou recebendo o seguinte erro e fez esta pergunta porque eu suspeito que os objetos LINQ to SQL:

Não é possível serializar o estado da sessão. Em 'StateServer' e modo 'SQLServer', ASP.NET irá serializar os objetos de estado de sessão, e como resultado não são permitidos objetos não serializáveis ??ou objetos MarshalByRef. A mesma restrição se aplica se a serialização semelhante é feito pelo armazenamento de estado de sessão personalizado no modo 'Custom'. [/ EDIT]

por exemplo.

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

Onde:

  • Zoo, leão, tigre, elefante todos saem de um ZooDataContext

eo arquivo web.config contém

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

Solução

Serialize-los usando o DataContractSerializer antes de armazenar em sessão ou qualquer outra coisa que pode querer serialize ... recentemente discutido aqui :

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

Outras dicas

Para usar o formatador binário (como SessionState usar creio eu), você precisa gerado seu código-se do DBML (I fazer isso atualmente com um modelo Linq2Sql T4).

A seguir necessidade de ser marca como [NonSerialized]:

  • EntityRef
  • EntitySet
  • Todos os eventos (você terá que pensar fora da caixa para fazer isso, o exercício para o leitor)

Além disso, a necessidade lógica construtor para ser movido para OnCreated. Você também deve certificar-se OnCreated é chamado quando deserializing modo que o objeto pode ser útil novamente. O é feito com o atributo [OnDeserializing].

Eu acredito que você precisa para marcar seus objetos como sendo serializado. Eu não tenho certeza se há maneira de fazer isso para todos os objetos gerados, mas para aqueles que você está colocando em sessão, você poderia criar uma classe parcial (por exemplo, de Lion) e dar-lhe o atributo Serializable.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top