gpt4 book ai didi

c# - 在 EF 6/Code First 中通过键查找本地缓存的实体

转载 作者:太空宇宙 更新时间:2023-11-03 13:07:27 25 4
gpt4 key购买 nike

EF 6,代码优先

我想写一个 TryGetLocalEntity() EF 6 的方法 DbContext这将按键查找一个实体,如果它存在于 DbContext.Set<TEntity().Local 中则返回它.我想根据实体键而不是对象引用进行查找。

所以方法签名可能是:

    public static bool TryGetLocalEntity<TContext, TEntity>(this TContext context, TEntity entity, out TEntity cachedEntity)
where TContext : DbContext
where TEntity : class
{

EntityKey key = ???GetEntityKey???(entity);
cachedEntity = context.Set<TEntity>().Local.Where(e => ???).FirstOrDefault();
return cachedEntity != null;
}

这样做的目的是获取一个已经从另一个来源反序列化的实体,或者 1) Attach()它到 DbContext如果它在本地不存在(由实体键而不是对象引用确定)或 2)检索本地缓存的实体,如果它确实存在(再次由实体键而不是对象引用确定)。我知道我可以从数据库中获取它,但如果我已经拥有我需要的东西,我想避免往返。

我认为我缺少的主要步骤是创建一个 EntityKey来自分离的 POCO 实体。从这里,我想我可以弄清楚如何在 DbContext 中查找基于 EntityKey .

更新 这是一个破解方法。显然有一些技巧,我还没有测试过:

using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Core;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Infrastructure.Pluralization;

public static bool TryGetLocalEntity<TContext, TEntity>(this TContext context, TEntity entity, out TEntity cachedEntity)
where TContext : DbContext
where TEntity : class
{
EnglishPluralizationService pluralizationService = new EnglishPluralizationService();
string setName = pluralizationService.Pluralize(typeof(TEntity).Name);
ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;
EntityKey key = objectContext.CreateEntityKey(setName, entity);
try
{
cachedEntity = objectContext.GetObjectByKey(key) as TEntity;
}
catch (ObjectNotFoundException)
{
cachedEntity = null;
}
return cachedEntity != null;
}

更新 当实体存在于上下文中但尚未保存到数据库时,我所拥有的似乎有效除外。我一直在 EF 源中挖掘,试图确定未保存/添加的实体是否没有 EntityKey .

最佳答案

你可以使用:

var objContext = ((IObjectContextAdapter)context).ObjectContext;
var objSet = objContext.CreateObjectSet<TEntity>();
var entityKey = objContext.CreateEntityKey(objSet.EntitySet.Name, entity);

关于c# - 在 EF 6/Code First 中通过键查找本地缓存的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30266367/

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