Вопрос по datacontext, entity-framework, wcf, concurrency – Entity Framework 4.1: как работать с контекстом данных времени жизни звонка?

1

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

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

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

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

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

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

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

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

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

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

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

Ваш Ответ

1   ответ
4

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

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. Лучшая практика состоит в том, чтобы сделать ваш сервис бесстатным Вам следует избегать сохранения данных между вызовами службы, и этому примеру это действительно не нужно.

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

Похожие вопросы