EF4 + STE: подключение через службу WCF?Использовать новый объектный текст каждый раз? - PullRequest
0 голосов
/ 09 января 2011

Я планирую использовать WCF (не ria) в сочетании с Entity Framework 4 и STE (права самостоятельного отслеживания). Если я правильно понимаю, мой WCF должен вернуть объект или коллекцию объектов (используя, например, LIST, а не IQueryable) клиенту (в моем случае silverlight)

Затем клиент может изменить сущность или обновить ее. На данный момент я считаю, что это самообследование ???? Это то, где я немного запутался, так как есть много сообщений о проблемах с STE, которые не отслеживаются.

В любом случае ... Затем для обновления мне просто нужно отправить объект обратно в мою службу WCF другим способом, чтобы выполнить обновление. Я должен каждый раз создавать новый OBJECTCONTEXT? В каждом методе?

Если я создаю новый объектный контекст каждый раз в каждом методе на моем WCF, тогда мне не нужно повторно присоединять STE к объектному тексту?

Так что в принципе это само по себе не сработает ??

using(var ctx = new MyContext())
{
    ctx.Orders.ApplyChanges(order);
    ctx.SaveChanges();
}

Или я должен один раз создать контекст объекта в конструкторе службы WCF, чтобы один и все дополнительные вызовы, использующие один и тот же экземпляр wcf, использовали один и тот же объектный контекст?

Я мог бы создавать и уничтожать службу wcf при каждом вызове метода от клиента - следовательно, каждый раз создавая новый объектный контекст.

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

Любое понимание или информация будут с благодарностью

спасибо

Ответы [ 2 ]

3 голосов
/ 09 января 2011

Вы задаете несколько вопросов, поэтому я постараюсь ответить на них отдельно:

Возвращая IQueryable:

Вы не можете вернуть IQueryalbe.IQueryable описывает запрос, который должен быть выполнен.Когда вы пытаетесь вернуть IQueryable из службы, он выполняется во время сериализации ответа службы.Обычно это вызывает исключение, поскольку ObjectContext уже закрыт.

Отслеживание на клиенте:

Да STE могут отслеживать изменения на клиенте, если клиент использует STE!Сборка с STE должна делиться между сервисом и клиентом.

Совместное использование ObjectContext:

Никогда не разделяйте ObjectContext в среде сервера, которая обновляет данные.Всегда создавайте новый экземпляр ObjectContext для каждого вызова.Я описал причины здесь .

Присоединение STE

Вам не нужно прикреплять STE.ApplyChanges сделает все за вас.Также, если вы хотите вернуть заказ обратно из вашей сервисной операции, вы должны вызвать AcceptChanges для него.

Создание контекста объекта в конструкторе сервиса:

Помните, что WCF имеет свойсобственные правила работы с экземплярами сервисов.Эти правила основаны на InstanceContextMode и используют привязку (и вы можете реализовать свои собственные правила, внедрив IInstanceProvider ).Например, если вы используете BasicHttpBinding, экземпляром по умолчанию будет PerCall, что означает, что WCF будет создавать новый экземпляр службы для каждого запроса.Но если вместо этого вы используете NetTcpBinding, по умолчанию будет использоваться экземпляр PerSession, и WCF будет повторно использовать один экземпляр службы для всех запросов, поступающих от одного клиента (экземпляр прокси-сервера одного клиента).

Повторное использование прокси службы на клиенте:

Это также зависит от используемой привязки и экземпляра службы.Когда используется привязка к сеансу, клиентский прокси относится к одному экземпляру службы.Вызов методов на этом прокси-сервере всегда будет выполнять операции с одним и тем же экземпляром службы, поэтому экземпляр службы может иметь состояние (может содержать данные, общие для вызовов).Это не очень хорошая идея, но это возможно.При использовании сеансово-ориентированного соединения вам приходится сталкиваться с несколькими проблемами, которые могут возникнуть (это более сложно).BasicHttpBinding не разрешает сеансы, поэтому даже при использовании одного клиентского прокси каждый вызов обрабатывается новым экземпляром службы.

0 голосов
/ 09 января 2011

Вы можете присоединить сущность к новому контексту объекта, см. http://msdn.microsoft.com/en-us/library/bb896271.aspx.

Но тогда у нее будет неизменное состояние.

Я бы сделал так:

  • для запроса базы данных для получения информации
  • сравнить ее с объектом, отправляемым в
  • Обновить сущность из базы данных с изменениями
  • Затемсделать обычные изменения сохранения

Редактировать

Выше было сделано для POCO, как указано в комментарии

Для STE вы создаетекаждый раз новый контекст, но используйте «ApplyChanges», см .: http://msdn.microsoft.com/en-us/library/ee789839.aspx

...