gpt4 book ai didi

c# - 当您不再有上下文引用时如何从上下文中分离实体

转载 作者:行者123 更新时间:2023-11-30 17:45:37 25 4
gpt4 key购买 nike

我正在我的网站上预加载产品数据,因为我需要这些数据可以快速访问,并且希望它在应用程序启动时加载一次,而不是仅在请求时加载。这是确保快速加载的一种方法。为此,我急切地将我的产品实体与其他一些实体一起加载并将它们存储在内存中。

然后我有类似下面的东西来检索我的数据:

public override IEnumerable<Product> Get()
{
var result = _cacheManager.Get(PreLoadCacheKey) as IEnumerable<Product>;
if (result != null)
return result;

return base.Get();
}

我面临的问题是,在我使用依赖注入(inject)的情况下,我无法控制我的数据上下文的范围(除了将它设置为 InstancePerRequest() 并保留它)所以当我缓存我的实体时,它们仍然有对原始上下文的引用。

我尝试了各种方法,但似乎无法解决以下问题:

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

当尝试将从缓存中检索到的实体附加到我正在添加到数据库中的新实体时。

我尝试过的事情:

  1. 使用 AsNoTracking() 检索数据
  2. 循环遍历所有结果,然后将它们添加到缓存中,并将它们从当前上下文中分离,然后在从缓存中检索时将它们附加到新上下文中。

理想情况下,我希望能够从实体的一侧分离实体的上下文,这样我就可以查看实体是否附加到当前上下文,如果没有,则将其与旧的上下文分离并附加它到新的。从我所看到的情况来看,唯一可以分离它的方法是引用我不会拥有的旧上下文。

我是否漏掉了一些明显的东西?

编辑

这是我将实体附加到另一个上下文的示例:

var orderLine = order.Lines.FirstOrDefault(ol => ol.Product.Id == product.Id) ?? new SalesOrderLine();

orderLine.Price = price.Price;
orderLine.Product = product; //This is my cache'd entity.
orderLine.ProductPriceType = price.ProductPriceType;
orderLine.Quantity += qty;

order.Customer = customer;
order.Lines.Add(orderLine);
order.Status = SalesOrderStatus.Current;

Update(order);
SaveChanges();

目前,我正在强行加载一个未缓存的版本来解决这个问题。

最佳答案

使用AsNoTracking 检索缓存数据是第一步。但是(显然)缓存中的对象是作为代理创建的,因此它们知道是由另一个上下文创建的。

因此请确保没有代理,只有 POCO 被缓存,您可以通过在将对象提取到缓存的上下文中禁用代理创建来实现这一点:

db.Configuration.ProxyCreationEnabled = false;

(其中 dbDbContext 实例)。

然后确保在使用该对象之前将其附加到新上下文。这很重要,因为如果您 Add() 一个新的 OrderLine,EF 也可能会尝试添加一个新的 Product

我想补充一点,如果您在实体模型中公开 OrderLine.ProductId,这一切都会变得容易得多:只需设置 Id 值就足够了。

关于c# - 当您不再有上下文引用时如何从上下文中分离实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27335291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com