Проблемы с ObjectContext.SaveChanges () в объектах ADO.NET - PullRequest
0 голосов
/ 16 марта 2011

У меня возникает следующая проблема при использовании представления, сопоставленного с хранимыми процедурами для обновления / вставки / удаления данных:

У меня есть таблица с именем tbCurrenciesRates, в этой таблице я ставлю курсы валют для каждой валюты по отношению к другой валюте, но если я обновляю курс пары валют доллар США / евро, я должен также обновить значение пар евро / доллар США.

Я использовал прямое сопоставление с таблицей tbCurrenciesRates в объектах ADO.NET 4.0, где среда генерировала запросы, необходимые для обновления / вставки / удаления записи. Я создаю новый контекст объекта (где никакие сущности не загружены) в наборе CurrenciesRates, затем я передаю объект CurrencyRate для курса USD / Euro, чтобы выполнить следующее:

  1. Я запрашиваю (используя linq) пару евро / доллар.
  2. Я обновляю его курс
  3. Сохраняю изменения.
  4. Пока все идет хорошо

Затем я прикрепляю пройденный курс CurrencyRate (для курса USD / Euro) и снова вызываю SaveChanges.

Используя прямой доступ к таблице, все идет хорошо, но когда я заменил таблицу на представление (я добавил все необходимые хранимые процедуры, отображающие для вставки / обновления / удаления), платформа выдает исключение, сообщающее, что присоединенный CurrencyRate ( для курса USD / Euro) уже существует.

Обратите внимание, что если я использую таблицу вместо представления, все идет хорошо. Эта ошибка возникает только тогда, когда я использую представление и когда я вызываю SaveChanges во второй раз, хотя я использую новый контекст объекта.

Вопрос в том, в чем разница между использованием таблицы и представления с объектами ADO.NET, запрашивает ли инфраструктура все объекты в базе данных при выполнении операции обновления, если она обращалась к данным с использованием представления.

Вот код:

            using (ICurrenciesRepository repository = NewCurrenciesRepository())
            {
                SetLastChangedDate(rate);
                CurrencyRate alternative = this.ProcessChangedCurrencyRate(rate, repository); //This performs the update correctly
                updates.Add(repository.UpdateCurrencyRate(rate)); //this fails to attach and update the rate object although I use a new repository and the rate was gotten  de-attached from another object context.

                if (alternative != null)
                    updates.Add(alternative);

                return updates;

            }

1 Ответ

0 голосов
/ 16 марта 2011

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

...