• appfabric cache存储ef 查询结果的bug


    image

    首先是表结构,一个一对多的关系,和一个单独的表来做测试

      1: var db = new TestDBEntities();
    
      2: var obj1 = db.tab1.FirstOrDefault();
    
      3: var list1 = db.tab1.ToList();
    
      4: 
    
      5: var user1 = db.Users.FirstOrDefault();
    
      6: var userlist = db.Users.ToList();
    
      7: 
    
      8: var order1 = db.Orders.FirstOrDefault();
    
      9: var orderlist = db.Orders.ToList();
    
     10: 
    
     11: 
    
     12: cache.Put("obj1", obj1);
    
     13: Console.WriteLine("单独表个体");
    
     14: cache.Put("list1", list1);
    
     15: Console.WriteLine("单独表list");
    
     16: 
    
     17: cache.Put("user1", user1);
    
     18: Console.WriteLine("user表个体");
    
     19: cache.Put("userlist", userlist);
    
     20: Console.WriteLine("user表list");
    
     21: 
    
     22: cache.Put("order1", order1);
    
     23: Console.WriteLine("order表个体");
    
     24: cache.Put("orderlist", orderlist);
    
     25: Console.WriteLine("order表list");

    查出来,放入cache,貌似没什么问题

    但是如果用下面的写法

      1: tab1 obj1;
    
      2: List<tab1> list1;
    
      3: Users user1;
    
      4: List<Users> userlist;
    
      5: Orders order1;
    
      6: List<Orders> orderlist;
    
      7: using (var db = new TestDBEntities())
    
      8: {
    
      9:     db.tab1.MergeOption = System.Data.Objects.MergeOption.NoTracking;
    
     10:     db.Users.MergeOption = System.Data.Objects.MergeOption.NoTracking;
    
     11:     db.Orders.MergeOption = System.Data.Objects.MergeOption.NoTracking;
    
     12:     obj1 = db.tab1.FirstOrDefault();
    
     13:     list1 = db.tab1.ToList();
    
     14:     user1 = db.Users.FirstOrDefault();
    
     15:     userlist = db.Users.ToList();
    
     16:     order1 = db.Orders.FirstOrDefault();
    
     17:     orderlist = db.Orders.ToList();
    
     18: }
    
     19: 
    
     20: cache.Put("obj1", obj1);
    
     21: Console.WriteLine("单独表个体");
    
     22: cache.Put("list1", list1);
    
     23: Console.WriteLine("单独表list");
    
     24: 
    
     25: cache.Put("user1", user1);
    
     26: Console.WriteLine("user表个体");
    
     27: cache.Put("userlist", userlist);
    
     28: Console.WriteLine("user表list");
    
     29: 
    
     30: cache.Put("order1", order1);
    
     31: Console.WriteLine("order表个体");
    
     32: cache.Put("orderlist", orderlist);
    
     33: Console.WriteLine("order表list");

    image

    两种写法的区别在于

    1、使用了using,关闭数据连接

    2、使用了notracking,或者使用

    order1 = db.CreateObjectSet<Orders>().FirstOrDefault();
    

    这种泛型形式

    Orders关联的Users是唯一的。此时,会报这个错误。

    注意,只有在一对多关系的多方放入缓存时,他要获取一那方的数据时会出错

    一方放入,对应多方是集合,不会报错

    猜测:大概是在序列化的时候会进行访问

    目前未找到什么通过配置cache能解决的方法。

    using,notracking,或泛型形式,都是在分层下经常使用的。

     

    最让我无语的是,同样的东西放到memcache里一点事都没有。真shit。

    参考memcache client,是做了二进制序列化,自己进行而进制序列化也不会有问题,不知道appfabric采用的是什么形式。

     

    已找到问题的原因,请看

  • 相关阅读:
    设计模式~门面模式
    设计模式~享元模式
    设计模式~代理模式
    Java IO流:(六)节点流(文件流)之 FileWriter
    Java IO流:(五)节点流(文件流)之 FileReader
    Java IO流:(四)节点流(文件流)
    Java IO流:(三)IO流四大基类
    Java IO流:(二)IO流原理及流的分类
    Java IO流:(一)File 文件类
    每周总结
  • 原文地址:https://www.cnblogs.com/czcz1024/p/2397444.html
Copyright © 2020-2023  润新知