0

我正在使用 EF Plus 的缓存功能在内存中缓存常用的不可变查找实体。

所有缓存的实体类型都可以是某个父实体集合的一部分(即:如果我在缓存中有一个 Product 类型的实体集合,我应该能够将它们中的任何一个添加到代理的 Order 实体的 Products 集合中, “本订单由这些产品组成”)

但是,当我将其中一个缓存项添加到“实时”实体的包含集合时,我得到以下异常:

{"The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects."}

我该如何解决?Autofac 已注册以创建上下文的 InstancePerRequest(),因此我想知道缓存的实体是否保留了旧的 DbContext。然而,我原以为 EFPlus 会默认分离它们。

缓存可以添加到实体集合属性的查找实体的最佳做法是什么?

编辑:我确实注意到了这一点:https ://entityframework.net/knowledge-base/27335291/how-to-detach-entity-from-context-when-you-no-longer-have-a-context-reference

编辑 2:现在我暂时禁用了代理创建,但它仍然无法正常工作。这是我得到的代码,它是从缓存中读取的唯一方法(忽略我在这里返回 IQueryable 的事实,我知道它是反模式,稍后会修复)

    public async Task<IQueryable<TEntity>> AsQueryable()
    {
        var proxyCreationEnabled = _context.Configuration.ProxyCreationEnabled;
        try
        {
            _context.Configuration.ProxyCreationEnabled = false;
            var unproxiedEntities = (await _dbSet.FromCacheAsync(_cacheKey)).AsQueryable();
            return unproxiedEntities;
        }
        finally
        {
            _context.Configuration.ProxyCreationEnabled = proxyCreationEnabled;
        }
    }

当我将缓存条目添加到实时代理对象的集合时,如下所示:

var otherIntervention = await _otherInterventionRepository.GetByIdAsync(otherInterventionId); // reads the cache
toBeSaved.OtherInterventions.Add(otherIntervention);

现在什么都没有发生……是的, otherInterventionId 是我要添加的实体的主键。

以下是我尝试过的其他内容:我尝试添加一个仅设置了 Id 字段的新 OtherIntervention 对象,但由于缺少 [Required] Description 字段而出现验证错误。如果我可以将一个新对象添加到 OtherInterventions 集合,并将 ID 字段设置为 EXISTING 查找记录的字段,我会很高兴。我真的不想创建 GetByIdAsync 的重载,它会跳过缓存并直接从上下文加载 - 那么缓存的意义何在?

编辑3:看起来我将不得不将缓存中的对象附加到我目前无法访问的上下文(它在存储库后面抽象)

如何在不将项目的父级和兄弟级加载到内存的情况下将项目添加到存储库

编辑 4:从缓存中附加一个对象给我一个错误,即具有相同 Id 的相同类型的对象已经存在!

我现在要放弃了。它需要很长时间才能修复。

如果有人知道任何解决方法,请分享。谢谢。

4

0 回答 0