Странное поведение ObjectContext Entity Framework (v4.0) - PullRequest
1 голос
/ 05 января 2011

Я перешел с фона NHibernate на Entity Framework v4.0.Когда я загружаю сущности в ObjectContext, я ожидаю, что они будут там кэшироваться, пока живет ObjectContext («кэш 1-го уровня»).Таким образом, если тот же запрос выполняется во второй раз, объекты уже находятся в ObjectContext и не должны загружаться снова.

Просмотрите этот запрос:

        using (var context = new Model1Container()) {
            //load entities from DB
            var entities = context.Entity1Set.ToArray();
            //entities should now be cached in the context (1st level cache)

            //why does this call not use the cached items?
            entities = context.Entity1Set.ToArray();
        }

В SQLServer Profiler, я ясно вижу, что оба вызова ToArray () вызывают запрос к базе данных.Зачем второму запросу требуется обход БД, а не поведение NHibernate?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 05 января 2011

Хороший вопрос. Я никогда не использовал NHibernate, но я использовал Entity Framework в течение последнего года или около того.

В некотором смысле описанное вами поведение имеет смысл для меня. Что если данные в базе данных изменяются между вызовами? Например, Entity Framework должен будет запросить базу данных, чтобы проверить, были ли какие-либо новые строки добавлены в таблицу базы данных.

Однако выполнение запроса LINQ по результатам не потребует повторного обращения к базе данных, поскольку Entity Framework будет извлекать существующие объекты из ObjectContext.

 var newEntities = entities.Where(x=>x.id==1).ToList();
 var newEntities2 = entities.Where(x=>x.id==1).ToList();
1 голос
/ 17 мая 2011

EF 4.0 не поддерживает ни одну форму кэша, ни кэш первого или второго уровня, как это делает NHibernate.

В EF 4.1 была реализована одна функция, похожая на кэш первого уровня NHibernate.

EF 4.1 Локальные данные

HTH

Riana

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