首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取本地实体或附加新实体

获取本地实体或附加新实体
EN

Stack Overflow用户
提问于 2018-06-08 03:04:06
回答 2查看 500关注 0票数 4

我的实体看起来像这样:

代码语言:javascript
运行
复制
public class User
{
    public int Id {get; set;}
}

我不想在每次获得特定用户时都查询数据库,因为我知道此Id存在用户。似乎Attach适用于这种情况,但是如果DbContext已经在本地存储了这个特定用户的实体,它将抛出一个异常。

举个我想做的例子:

代码语言:javascript
运行
复制
var user1 = ctx.GetLocalOrAttach(new User{Id = 1});
var user2 = ctx.GetLocalOrAttach(new User{Id = 2});
AddUserRelation(user1, user2);

对此有什么解决方案吗?如果不是,那么检查实体是否在本地存在的理想方法是什么。

EN

Stack Overflow用户

回答已采纳

发布于 2018-06-08 04:13:07

您可以搜索DbSet.Local属性,但效率会很低。

IMO的一个更好的方法是使用我对Delete loaded and unloaded objects by ID in EntityFrameworkCore的回答中的FindTracked自定义扩展方法

代码语言:javascript
运行
复制
using Microsoft.EntityFrameworkCore.Internal;

namespace Microsoft.EntityFrameworkCore
{
    public static partial class CustomExtensions
    {
        public static TEntity FindTracked<TEntity>(this DbContext context, params object[] keyValues)
            where TEntity : class
        {
            var entityType = context.Model.FindEntityType(typeof(TEntity));
            var key = entityType.FindPrimaryKey();
            var stateManager = context.GetDependencies().StateManager;
            var entry = stateManager.TryGetEntry(key, keyValues);
            return entry?.Entity as TEntity;
        }
    }
}

这类似于EF核心Find方法,但如果实体在本地不存在,则不会从数据库加载该实体。

您的案例的用法如下:

代码语言:javascript
运行
复制
var user1 = ctx.FindTracked(1) ?? ctx.Attach(new User { Id = 1 }).Entity;
var user2 = ctx.FindTracked(2) ?? ctx.Attach(new User { Id = 2 }).Entity;
AddUserRelation(user1, user2);
票数 5
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50748522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档