NullReferenceException при получении данных из Memcached (.NET) - PullRequest
1 голос
/ 31 октября 2011

Возникли проблемы при получении данных из Memcached на .NET MVC.

У меня есть этот репозиторий:

public List<DropDownLocalization> GetLocalization(string key, string lang)
        {
            var result = cacheClient.Get<IQueryable<DropDownLocalization>>("DD_" + key + "_" + lang);
            if (result == null)
            {
                int getLangId = _db.languages.Where(d => d.Association == lang).Select(d => d.Id).FirstOrDefault();
                int getLableItemId = _db.lables_dropdown.Where(d => d.Key == key).Select(d => d.Id).FirstOrDefault();
                var get = _db.lables_dropdown_items.Where(d => d.LableId == getLableItemId).Select(d => new DropDownLocalization
                                                    {
                                                        DDId = d.Id,
                                                        DDName = d.lables_dropdown_values.Where(m => m.Language == getLangId).Select(m => m.Value).FirstOrDefault()
                                                    }).AsQueryable();
                cacheClient.Store(StoreMode.Add, "DD_" + key + "_" + lang, (IQueryable<DropDownLocalization>)get);
                EFQueryLogger.WriteQuery(((ObjectQuery)get).ToTraceString());
                return get.ToList();
            }
            return result.ToList();
        }

Это список выпадающих меток, локализованных из текущего языка.

Так что он пытается получить данные из кеша, если не удастся поместить данные в кеш. В то время как я комментирую часть кода с помощью оператора «if» (просто чтобы посмотреть, получает ли он данные из кеша), у меня есть ошибка нулевой ссылки. Это означает, что ответ на запрос не находится в кэше.

Может кто-нибудь поставить мой нос к проблеме?

Моя конфигурация клиентской библиотеки enym:

<enyim.com>
    <memcached protocol="Text">
      <servers>
                <add address="localhost" port="11211" />
      </servers>
      <socketPool deadTimeout="00:00:10" />
    </memcached>
  </enyim.com>

Ответы [ 2 ]

0 голосов
/ 01 ноября 2011
  • Напечатайте ваши сопоставления и сущности, пожалуйста.
  • Включены LazyLoad и ProxyGeneration?
  • Тестировали ли вы его из нескольких доменов приложений?

контрольный пример:

  1. AppDomain "A" добавлен в сериализованный memcached код EF 4.1 Первый объект "e1" (динамический тип прокси из области "A")
  2. AppDomain "B" получен из объекта memcached"e1" и попробуйте десириализовать его

AssertException

Could not load file or assembly 
'EntityFrameworkDynamicProxies-***.DomainModel,
 Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
 or one of its dependencies. The system cannot find the file specified.
0 голосов
/ 01 ноября 2011

Решение найдено. К сожалению это были мои ошибки. Существует практика хранения модели данных в memcached.

У меня есть модель:

[Serializable]
    public class DropDownLocalization
    {
        public int DDId { get; set; }
        public string DDName { get; set; }
    }

И метод, который возвращает результат:

public List<DropDownLocalization> GetLocalization(string key, string lang)
        {
           List<DropDownLocalization> result = MemcachedSingleton.Instance.Get<List<DropDownLocalization>>("DD_" + key + "_" + lang);
           if (result == null)
           {
               int getLangId = _db.languages.Where(d => d.Association == lang).Select(d => d.Id).FirstOrDefault();
               int getLableItemId = _db.lables_dropdown.Where(d => d.Key == key).Select(d => d.Id).FirstOrDefault();
               result = _db.lables_dropdown_items.Where(d => d.LableId == getLableItemId).Select(d => new DropDownLocalization
                                                   {
                                                       DDId = d.Id,
                                                       DDName = d.lables_dropdown_values.Where(m => m.Language == getLangId).Select(m => m.Value).FirstOrDefault()
                                                   }).ToList();
               MemcachedSingleton.Instance.Store(StoreMode.Add, "DD_" + key + "_" + lang, result);
               return result;
           }
           return result;
        }

Теперь он полностью работает.

Конфиг должен быть следующим:

<enyim.com>
    <memcached protocol="Text">
      <servers>
        <add address="localhost" port="11211" />
      </servers>
      <transcoder type="Enyim.Caching.Memcached.DataContractTranscoder, Enyim.Caching" />
      <socketPool deadTimeout="00:00:10" />
    </memcached>
  </enyim.com>
...