Как я могу реализовать (чисто) кэширование для типов сущностей EF? - PullRequest
0 голосов
/ 14 сентября 2011

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

Пример:

namespace EomApp1.Formss.AB2.Model
{
    public class UnitConversionSource : EomApp1.Formss.AB2.Model.IUnitConversionSource
    {
        IEnumerable<UnitConversion> IUnitConversionSource.UnitConversions(DirectAgentsEntities model)
        {
            yield return new UnitConversion
            {
                Coefficient = 1,
                FromUnit = model.Units.First(c => c.Name == "USD"),
                ToUnit = model.Units.First(c => c.Name == "USD"),
                DateSpan = new DateSpan
                {
                    FromDate = DateTime.Now,
                    ToDate = DateTime.Now.Add(TimeSpan.FromHours(1))
                }
            };
        }
    }
}

Желаемый: выполняется первое выполнение в заданном периоде истечения (скажем, 10 секунд) model.Units.First(c => c.Name == "USD"), объект извлекается из базы данных, но впоследствии (в течение срока действия) поступает из кэша памяти.

Цель: не допустить, чтобы цикл, вставляющий миллион строк, выполнял один и тот же запрос выбора миллион раз.

Меня, в частности, интересует неинтрузивное решение, которое не влияет на то, как я пишу код в примере. Это (мы надеемся) в духе лучших практик с точки зрения разделения интересов.

(ps: я не уверен, было ли мое использование термина «неинтрузивный» стандартным семантическим - дайте мне знать, если есть лучший способ выразить это)

1 Ответ

0 голосов
/ 14 сентября 2011

Я не уверен, в чем смысл вашего кода, но он имеет очевидное и правильное решение:

    IEnumerable<UnitConversion> IUnitConversionSource.UnitConversions(DirectAgentsEntities model)
    {
        string unit = model.Units.First(c => c.Name == "USD");

        yield return new UnitConversion
        {
            Coefficient = 1,
            FromUnit = unit,
            ToUnit = unit,
            DateSpan = new DateSpan
            {
                FromDate = DateTime.Now,
                ToDate = DateTime.Now.Add(TimeSpan.FromHours(1))
            }
        };
    }

Если вы знаете, что вам нужно использовать некоторые значения очень часто, то это правильный способ извлечь их в некоторый словарь и обработать его время жизни самостоятельно или в рамках некоторого API кеша.

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

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