appfabric cache存储ef 查询结果的bug
首先是表结构,一个一对多的关系,和一个单独的表来做测试
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");
两种写法的区别在于
1、使用了using,关闭数据连接
2、使用了notracking,或者使用
order1 = db.CreateObjectSet<Orders>().FirstOrDefault();
这种泛型形式
Orders关联的Users是唯一的。此时,会报这个错误。
注意,只有在一对多关系的多方放入缓存时,他要获取一那方的数据时会出错
一方放入,对应多方是集合,不会报错
猜测:大概是在序列化的时候会进行访问
目前未找到什么通过配置cache能解决的方法。
using,notracking,或泛型形式,都是在分层下经常使用的。
 
最让我无语的是,同样的东西放到memcache里一点事都没有。真shit。
参考memcache client,是做了二进制序列化,自己进行而进制序列化也不会有问题,不知道appfabric采用的是什么形式。
 
已找到问题的原因,请看
 
                    
                     
                    
                 
                    
                

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号