Model view controller 实体框架和缓存-更改可追溯到缓存

Model view controller 实体框架和缓存-更改可追溯到缓存,model-view-controller,caching,entity-framework-4,Model View Controller,Caching,Entity Framework 4,我从实体模型中提取了一些数据。它包含项目的属性,比如具有最大速度、重量和大小的汽车零件。因为有很多部分,而且基本属性从未改变,所以我缓存了所有记录 根据使用这些零件的汽车,这些属性现在可能会更改,因此我设置了一辆新车,将缓存项“Engine”中的值复制到新车对象,然后添加“涡轮增压器”,从而提高发动机的最大速度、重量和尺寸 我遇到的问题是,实体模型似乎仍在将上下文跟踪回缓存数据。因此,当使用局部方法增加权重时,所有用户的权重都会增加。我尝试将“MergeOption.NoTracking”添加到

我从实体模型中提取了一些数据。它包含项目的属性,比如具有最大速度、重量和大小的汽车零件。因为有很多部分,而且基本属性从未改变,所以我缓存了所有记录

根据使用这些零件的汽车,这些属性现在可能会更改,因此我设置了一辆新车,将缓存项“Engine”中的值复制到新车对象,然后添加“涡轮增压器”,从而提高发动机的最大速度、重量和尺寸

我遇到的问题是,实体模型似乎仍在将上下文跟踪回缓存数据。因此,当使用局部方法增加权重时,所有用户的权重都会增加。我尝试将“MergeOption.NoTracking”添加到我的上下文中,因为这应该会删除所有实体跟踪,但它似乎仍在跟踪。如果我关闭缓存,它可以正常工作,因为它每次都从数据库中提取新的值

如果我想从实体模型复制一条记录,有没有一种方法可以说“复制对象,但将其视为标准对象,没有来自实体的历史记录”,这样,一旦我的汽车具有某个项目的属性,它就是一个展平的对象


干杯

我不太确定MergeOption.NoTracking在整个上下文中的作用以及它的确切作用,但作为替代方法,您可以从数据库中将.AsNoTracking()添加到查询中。这肯定会返回一个分离的对象。 请在此处查看有关AsNoTracking用法的一些详细信息:

另一件事是确保在插入缓存之前枚举集合,以确保不在可查询范围内操作,即使用.ToArray()


另一个选项是手动从上下文中分离对象(使用detach(T entity))。

我以前尝试过使用.NoTracking,但我相信只有在使用DbContext时才会这样做。但是,您提到了分离(T实体)。我提取了我的记录,在上下文上运行了detach(我一直认为你在返回的对象上运行了detach,而不是在上下文上!),然后砰的一声,所有东西都在缓存中完美地工作!谢谢你,先生D