C# 缓存实体会导致不需要的插入

C# 缓存实体会导致不需要的插入,c#,asp.net,entity-framework,entity-framework-4,C#,Asp.net,Entity Framework,Entity Framework 4,如果缓存整个表: static List<Table1> table1Cache = context.Table1.ToList(); 由于第三行的原因,将在表1中插入新行。英孚认为这是一个新的实体。我知道我可以做一些事情,比如在创建de上下文时总是附加缓存(每个请求有一个上下文),或者使用MyTable1ReferenceID=table1Cache.Single(x=>x.Id==paramIntId).Id 但它不安全,我有时会忘记,有一个好的解决方案?是的,这是有意义的,因

如果缓存整个表:

static List<Table1> table1Cache = context.Table1.ToList();
由于第三行的原因,将在表1中插入新行。英孚认为这是一个新的实体。我知道我可以做一些事情,比如在创建de上下文时总是附加缓存(每个请求有一个上下文),或者使用MyTable1ReferenceID=table1Cache.Single(x=>x.Id==paramIntId).Id


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

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

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

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

var context = new Context();
var t2 = new Table2();
t2.MyTable1Reference = table1Cache.Single(x=>x.Id == paramIntId);
context.SaveChanges();