У меня возникает следующая проблема при использовании представления, сопоставленного с хранимыми процедурами для обновления / вставки / удаления данных:
У меня есть таблица с именем tbCurrenciesRates, в этой таблице я ставлю курсы валют для каждой валюты по отношению к другой валюте, но если я обновляю курс пары валют доллар США / евро, я должен также обновить значение пар евро / доллар США.
Я использовал прямое сопоставление с таблицей tbCurrenciesRates в объектах ADO.NET 4.0, где среда генерировала запросы, необходимые для обновления / вставки / удаления записи. Я создаю новый контекст объекта (где никакие сущности не загружены) в наборе CurrenciesRates, затем я передаю объект CurrencyRate для курса USD / Euro, чтобы выполнить следующее:
- Я запрашиваю (используя linq) пару евро / доллар.
- Я обновляю его курс
- Сохраняю изменения.
- Пока все идет хорошо
Затем я прикрепляю пройденный курс 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;
}