0

Извините, если это глупый вопрос, но я устал сегодня, и Google не помогает. Это должна быть общая проблема, но я ничего не нашел, отвечая на вопрос.Как разрешить нескольким пользователям выполнять обновления Db в Entity Framework в распределенном приложении

Всякий раз, когда я использовал Entity Framework в настольных приложениях clickonce, я немного пострадал, когда «объект объекта не может ссылаться на несколько экземпляров IEntityChangeTracker». Это возникает, когда несколько версий одного и того же объекта базы данных обновляются разными версиями контекста.

В веб-проекте легко обойти эту проблему, отправив все вызовы Db через какой-то одноэлементный шаблон на сервере. Если вы обрабатываете много сообщений об обновлении/вставке Db для службы, вы можете сделать то же самое.

Но что, если у вас есть распределенное приложение (например, WPF через clickonce), в котором потенциально может быть много пользователей, подключающихся к базе данных. У каждого пользователя есть своя установка кода, поэтому, даже если вы отделите бизнес-логику от логики Db, каждый пользователь будет по-прежнему иметь свою собственную копию контекста.

Есть ли какой-либо шаблон или метод, который позволил бы вставлять/обновлять прямо из приложения, избегая проблемы с «множественными контекстами»? Или использовать что-то вроде службы Windows - единственный способ добиться этого?

+0

Это проблема параллелизма? можете ли вы добавить временную метку в своей модели? – Larry

+0

@Larry - это проблема - это предполагаемая система, которая будет иметь довольно большое количество пользователей, некоторые из которых захотят работать с одними и теми же данными одновременно. Поскольку мы все еще находимся на стадии планирования, мы можем рассмотреть возможность добавления временных меток к записям, если это поможет (и я могу видеть, как это возможно). Меня все равно интересовало бы более «техническое» решение, из любопытства. –

+0

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

ответ

3

Можете ли вы воспроизвести эту ошибку даже с помощью одного пользователя, запускающего ваше приложение?

Поскольку получение объекта сущности не может ссылаться на несколько экземпляров IEntityChangeTracker, ошибка означает, что вы создаете 2 DBContext в своем коде и пытаетесь управлять сущностью (созданной или прочитанной) из контекста через другой контекст. Ничего о распределенной параллельности. Ничего о нескольких пользователях.

Проверьте это SO question и попробуйте идентифицировать шаблон ошибки в вашем коде. В примере два контекста находятся в памяти, но, поскольку каждый объект сохраняет ссылку на свой IEntityChangeTrackeer, вы можете получить эту ошибку, даже если ее DbContext был удален, и вы пытаетесь управлять объектом с другим контекстом.

Смежные вопросы