如果我缓存整个表:
static List<Table1> table1Cache = context.Table1.ToList();
然后我用它来联想:
var context = new Context();
var t2 = new Table2();
t2.MyTable1Reference = table1Cache.Single(x=>x.Id == paramIntId);
context.SaveChanges();
由于第三行,将向Table1插入一个新行。 EF认为这是一个新实体。我知道我可以像创建de context时那样处理缓存(每个请求有1个上下文),或者使用MyTable1ReferenceID = table1Cache.Single(x =&gt; x.Id == paramIntId).Id;
但它不安全,我有时会忘记,有一个很好的解决方案吗?
答案 0 :(得分:0)
是的,这是有道理的,因为实体当前没有与当前上下文相关联。因此EF认为它是短暂的并且保存了一个新的实例。
如果要跨上下文缓存,则不希望存储对象本身。与上下文有关。相反,您希望将数据存储在缓存中。基本上序列化和反序列化实体。您还需要在当前上下文关联实体,以便下次从缓存中检索实体时,您可以将更改保存到缓存和数据库。
如果所有这些听起来很多,那就是。保持2个数据存储同步不是一个容易解决的问题。我将看一下NHibernate的二级缓存的实现。