gpt4 book ai didi

c# - 在 EF4.1 中正确地从上下文附加和分离实体

转载 作者:IT王子 更新时间:2023-10-29 04:09:37 26 4
gpt4 key购买 nike

我正在尝试为实体实现缓存机制。为了正确且无缝地使用缓存,我需要在将实体放入缓存之前将实体与当前上下文分离,并在从缓存中获取实体时将其附加回新上下文。 (我的上下文生命周期是每个 http 请求)

要求是——

  1. 当实体被分离时,不应删除与之关联的所有导航属性(我已经填充)。
  2. 如果需要,我可以更新缓存项(因此将它们正确附加到新上下文很重要)。

这是我尝试创建一个 EntityCache 类 -(这里的 ServerCache 是我的包装类,它将对象推送到 ASP.NET 缓存)

public static class EntityCache
{
private static DbContext context
{
get
{
return (DbContext)HttpContext.Current.Items[ObjectKeys.ContextRequestItemKey];
}
}

private static void Detach(object entity)
{
var trackedEntity = entity as IEntityWithChangeTracker;
trackedEntity.SetChangeTracker(null);
((IObjectContextAdapter)context).ObjectContext.Detach(entity);
}

private static void Attach(object entity)
{
((IObjectContextAdapter)context).ObjectContext.Attach((IEntityWithKey)entity);
}

public static void Remove(string key)
{
ServerCache.Remove(key);
}

public static object Get(string key)
{
object output = ServerCache.Get(key);
if (output != null)
Attach(output);
return output;
}

public static void ShortCache(String key, object data)
{
if (data != null)
{
Detach(data);
ServerCache.ShortCache(key, data);
}
}

public static void LongCache(String key, object data)
{
if (data != null)
{
Detach(data);
ServerCache.LongCache(key, data);
}
}
}

当我将一个实体放入缓存时,它是 DynamicProxy 类型而不是真正的类。

附加根本不起作用 - 我得到一个异常,我无法将 Dynamic_{blahblah} 类型的对象放入 IEntityWithKey。

我只是在网上看到这些附加和分离的示例并进行了尝试,我对此处附加/分离方法的任何新实现持开放态度。

谢谢。

跟进问题-

context.Entry(entity).State = EntityState.Detached;

有效,但使所有加载的导航属性为 NULL,当我们从上下文分离时,我们如何让它保持导航属性而不用 NULL 替换(或丢失)它们。

最佳答案

IEntityWithKey 是其他类型实体的接口(interface)。它适用于“大”实体。例如 EntityObject 实现这个接口(interface)。这些实体不被视为 POCO,并且不受 DbContext API 支持。

如果您想使用 IEntityWithKey,您的类必须实现它 - 它不会自动发生。

正确附加 DbContext API 应该是:

dbContext.Set(typeof(entity)).Attach(entity); 

希望这也能奏效:

dbContext.Entry(entity).State = EntityState.Unchanged;

正确分离 DbContext API 应该是:

dbContext.Entry(entity).State = EntityState.Detached;

此外,泛型方法比 object 更好。

关于c# - 在 EF4.1 中正确地从上下文附加和分离实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7678665/

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