Являются ли объекты Linq to sql сериализуемыми для состояния сеанса? - PullRequest
4 голосов
/ 29 октября 2009

Не вдаваясь в то, хорошая это или плохая идея:

Возможно ли сохранить доменный объект LINQ-to-SQL в сеансе ASP.NET, когда сеанс вне процесса ?

[EDIT] В настоящее время я получаю следующую ошибку и задал этот вопрос, потому что я подозреваю, что объекты LINQ-to-SQL:

Невозможно сериализовать состояние сеанса. В режимах «StateServer» и «SQLServer» ASP.NET сериализует объекты состояния сеанса, и в результате несериализуемые объекты или объекты MarshalByRef не допускаются. То же ограничение применяется, если аналогичная сериализация выполняется в пользовательском хранилище состояний сеанса в режиме «Пользовательский». [/ EDIT]

, например

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

где:

  • Зоопарк, Лев, Тигр, Слон - все вышло из ZooDataContext

и файл web.config содержит

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

Ответы [ 3 ]

4 голосов
/ 29 октября 2009

Чтобы использовать двоичный форматер (как я полагаю, использует SessionState), вам нужно будет сгенерировать свой код самостоятельно из DBML (в настоящее время я делаю это с помощью шаблона Linq2Sql T4).

Следующее необходимо отметить как [NonSerialized]:

  • EntityRef
  • EntitySet
  • Все события (для этого вам нужно мыслить нестандартно, упражнение для читателя)

Также необходимо переместить логику конструктора в OnCreated. Вы также должны убедиться, что OnCreated вызывается при десериализации, чтобы объект снова мог быть полезен. Это делается с атрибутом [OnDeserializing].

1 голос
/ 29 октября 2009

Сериализуйте их, используя datacontractserializer перед сохранением в сеансе или что-нибудь еще, что может захотеть сериализовать ... Недавно обсуждалось здесь :

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

1 голос
/ 29 октября 2009

Я считаю, что вам нужно пометить ваши объекты как сериализуемые. Я не уверен, есть ли способ сделать это для всех сгенерированных объектов, но для тех, которые вы вводите в сеанс, вы можете создать частичный класс (например, Lion) и присвоить ему атрибут Serializable.

...