EF Code First и кеширование - PullRequest
       4

EF Code First и кеширование

2 голосов
/ 12 октября 2011

У меня есть следующий псевдокод с использованием EF Code First:

User user = GetFromCache();

Playlist playlist = new Playlist { Name = "name", User = user };

playlistRepository.Add(playlist);

unitOfWork.Commit();

Метод GetFromCache () проверяет, находится ли пользователь в кеше, и, если нет, использует хранилище для получения его из базы данных.,Если он находится в кеше, он его возвращает.

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

Почему это так?

1 Ответ

1 голос
/ 12 октября 2011

Объекты, созданные контекстом, сохраняют ссылку на этот контекст для отложенной загрузки и отслеживания изменений.Если вы собираетесь кэшировать сущность, вы должны удалить ссылку на этот контекст, отсоединив ее (поскольку контекст побочного эффекта не будет GCed, пока у сущности нет других ссылок).

Так что если вы собираетеськэшируйте его, отсоедините его следующим образом

context.Entry(user).State = EntityState.Detached;

Затем внутри вашего GetFromCache() вам необходимо присоединить сущность к текущему контексту.В противном случае EF вставит новую запись для объекта пользователя.

User GetFromCache()
{
    var user = /* retrieve from cache */
    if (user != null)
    {
        context.Users.Attach(user);
    }
    else
    {
        //get user from database
    }

    return user;    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...