0

如果我缓存整个表:

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 认为这是一个新实体。我知道我可以做一些事情,比如在创建上下文时总是附加缓存(每个请求我有 1 个上下文),或者使用 MyTable1ReferenceID = table1Cache.Single(x=>x.Id == paramIntId).Id;

但是它不安全,我有时会忘记,有一个好的解决方案吗?

4

1 回答 1

0

是的,这是有道理的,因为实体当前没有与当前上下文相关联。因此 EF 认为它是暂时的并保存了一个新实例。

如果您要跨上下文进行缓存,那么您不想存储对象本身。这与上下文有关。相反,您希望将数据存储在缓存中。基本上序列化和反序列化实体。您还需要在当前上下文时关联实体,以便下次从缓存中检索它时,您可以将更改保存到缓存和数据库。

如果这一切听起来很多,那就是。保持 2 个数据存储同步并不是一个容易解决的问题。我会看看 NHibernate 的二级缓存的实现。

于 2012-06-29T16:41:40.607 回答