Entity Framework 4.1: как работать с контекстом данных времени жизни звонка?

Согласно этомусообщениеЯ использую контекст данных для каждого вызова, поэтому в каждом методе моей службы WCF я используюusing block создать новый контекст данных.

Но у меня есть некоторые сомнения в форме, чтобы работать таким образом.

Например, я использую метод getAllCLients () из своего репозитория, чтобы получить всех клиентов базы данных, затем служба отправляет клиенту, который вызывает метод, список со всеми клиентами. Затем пользователь изменяет информацию о некоторых из них, например, три. Изменить клиента, возможно, я могу добавить в список, в котором есть измененные клиенты.

Когда я хочу обновить эти три клиента, я могу вызвать метод updateClients (), который получает список измененных клиентов. Как я использую новый контекст данных для каждого метода, в updateCients () получаю новый dataContext, без сущностей, поэтому я думаю, что я должен выполнить следующие шаги:

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

2.- иди кидай коллекцию клиентов из DBSet (я использую EF 4.1) и меняй информацию. Это заставляет меня бросить список, который я получаю из клиентского приложения тоже. Поэтому я должен бросить два списка. Это требует ресурсов.

3.- сохранить изменения. Это необходимо в любом случае, так что больше не требуется больше работы.

Есть ли способ сделать шаг 2 легко? существует какой-то метод в dataContext для передачи значений от моего измененного клиента клиенту в контексте данных? Я использую POCO-сущности, возможно, существует простой способ сделать это.

Другой вопрос о параллелизме. Если я контролирую параллелизм с пессимистическим параллелизмом, который разрешает EF (например, с полем временной метки), лучше ли вызывать метод updateClient () по одному для каждого клиента или лучше передать список со всеми клиентами? Я имею в виду, что если я использую список в качестве параметра, если существует проблема параллелизма с одним клиентом, например, со вторым, первый клиент будет обновлен корректно, а второй - нет, а третий - нет. Как я могу уведомить пользователя, что есть проблемы с некоторыми клиентами?

Чтобы возобновить, я хотел бы знать, как лучше всего делать обновления, когда у меня есть короткий текст данных.

Благодарю. Daimroc.

Ответы на вопрос(1)

Решение Вопроса

поэтому, когда ваш клиент передает обратно измененные записи, вам просто нужно обработать их как измененные. Для этого вам не нужно загружать все записи из базы данных.

public void SaveClients(List<Client> modifiedClients)
{
    using (var context = new Context())
    {
        modifiedClients.ForEach(c => 
           {
               context.Entry(c).State = EntityState.Modified;
           });
        context.SaveChanges(); 
    }
}

Если вы используете услугу для каждого вызова, и для каждой операции службы нужен контекст, вы можете переместить свой экземпляр контекста в конструктор службы, потому что экземпляр службы будет жить только для одного вызова службы сервера = вам это не нужноusing за каждый звонок. Если вы делаете это, не забудьте реализоватьIDisposable К вашим услугам распоряжаться контекстом.

Other question is about concurrency. If I control the concurrency with pesimistic concurrency that allow EF (with a timestamp field for example), is it better to call the updateClient() one for each client or better to pass a list with all the clients?

EF не поддерживает пессимистический параллелизм из коробки. Использование метки времени является оптимистичным параллелизмом, поскольку позволяет другим использовать запись. Пессимистичный параллелизм - это логика приложения, при которой другой клиент не может выбрать заблокированную запись для обновления.

Параллельность разрешена для каждой записи, но проблема в этом случае - транзакция. Каждый звонокSaveChanges приводит к транзакции, используемой для обработки всех изменений в базе данных. Поэтому, если какая-либо из ваших измененных записей не обновлена, вы получите исключение параллелизма, и вся транзакция откатится = запись не обновлена.

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

Btw. Лучшая практика состоит в том, чтобы сделать ваш сервис бесстатным Вам следует избегать сохранения данных между вызовами службы, и этому примеру это действительно не нужно.

 16 апр. 2012 г., 11:54
Вы должны хранить это где-нибудь.
 Álvaro García16 апр. 2012 г., 11:47
как узнать клиент (обратный вызов), которому я хочу позвонить? Благодарю.
 16 апр. 2012 г., 11:38
Никакой дуплексный сценарий не требует сеанса.
 Álvaro García16 апр. 2012 г., 12:15
в статическом списке, например? это заставляет меня в каждом методе проверять, существует ли обратный вызов в списке или нет. Я прав?
 Álvaro García16 апр. 2012 г., 11:01
Что ж, моя идея сохранения данных от вызовов заключается в том, что пользователь имеет привилегии уровня доступа, а также я хочу отправить клиенту только те данные, которые предназначены для пользователя, поэтому я хотел бы узнать некоторые данные о подключенных клиент, как уровень привилегий и обратного вызова. Поэтому я считаю, что для каждой сессии это был лучший вариант. Также я хотел бы, чтобы вам позвонили. можно ли использовать дуплекс в услуге «за звонок»? Благодарю.

Ваш ответ на вопрос