1

在 .NET MVC 解决方案上从 Memcached 获取数据时出现问题。

我有这个自定义存储库:

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>
4

2 回答 2

0

找到解决方案。不幸的是,这是我的错误。有如何将数据模型存储在 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>
于 2011-11-01T14:25:44.557 回答
0
  • 请打印您的映射和实体。
  • 是否启用了 LazyLoad 和 ProxyGeneration?
  • 您是否从多个 AppDomain 对其进行了测试?

测试用例:

  1. AppDomain“A”添加到 memcached 序列化 EF 4.1 Code First 实体“e1”(来自“A”范围的动态代理类型)
  2. AppDomain "B" 从 memcached 实体 "e1" 获取并尝试反序列化它

断言异常

无法加载文件或程序集
'EntityFrameworkDynamicProxies-***.DomainModel,
 版本=1.0.0.0,文化=中性,PublicKeyToken=null'
 或其依赖项之一。该系统找不到指定的文件。
于 2011-11-01T16:10:05.573 回答