Модель EF 4.0 кэширует данные и не обнаруживает измененные данные - PullRequest
6 голосов
/ 01 сентября 2010

Я занимаюсь разработкой приложения ASP.NET и у меня возникли проблемы с моделью EF 4.0.

Модель EF обнаруживает новые добавленные и удаленные данные, но не измененные данные из базы данных.

Вот пример проблемы, которую я имею.

A- База данных:

Скрипт для создания таблицы базы данных "Сотрудники"

CREATE TABLE [dbo].[Employees]
  (
   [id] [int] IDENTITY(1, 1)
         NOT NULL,
   [name] [nvarchar](50) NULL,
   CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED ( [id] ASC )
    WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
        IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
        ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]
  )
ON [PRIMARY]

B- Приложение:

Вот ссылка на пример проекта Нажмите здесь .

Действия по воспроизведению ошибки:

1- Создайте базу данных и запуститесценарий для создания таблицы.

2- Вставьте тестовые данные в таблицу сотрудников и запустите приложение.данные будут загружены на страницу по умолчанию.

3- Измените строку подключения и запустите приложение.

3- Обновите некоторые значения в базе данных (непосредственно из sql).и обновите страницу

Вы обнаружите, что приложение по-прежнему отображает старые данные, в то время как при добавлении или удалении элемента из таблицы он добавляется или удаляется из представления соответственно.

Спасибо зазаранее за вашу помощь.

Ответы [ 2 ]

6 голосов
/ 01 сентября 2010

Это правильное поведение, основанное на основных понятиях ORM.Это также работает для Linq to SQL.Причиной этого является шаблон проектирования IdentityMap, который гарантирует, что каждый объект, идентифицируемый его ключом, создается только один раз для контекста объекта.Таким образом, ваш первый запрос создает объекты, но ваши последующие запросы не воссоздают их - они уже существуют.Полное описание этой проблемы описано в этой очень приятной статье .

0 голосов
/ 08 сентября 2010

Вы можете избежать этого, используя новый объект модели сущности в своем коде в каждом методе.Или вы можете прочитать дополнительную информацию в следующем ответе на тот же вопрос в MSDN, Нажмите здесь

...