是否可以检查对象是否已附加到实体框架中的数据上下文?

2023-12-12

当尝试附加已附加到给定上下文的对象时,我收到以下错误context.AttachTo(...):

ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象。

有没有一种方法可以实现以下目标:

context.IsAttachedTo(...)

Cheers!

Edit:

Jason 概述的扩展方法很接近,但它不适用于我的情况。

我正在尝试使用另一个问题的答案中概述的方法做一些工作:

如何使用 Linq to Entities *不*先检索行从表中删除一行或多行?

我的代码看起来有点像这样:

var user = new User() { Id = 1 };
context.AttachTo("Users", user);
comment.User = user;
context.SaveChanges();

这工作正常,除非我为该用户执行其他操作,使用相同的方法并尝试附加虚拟对象User目的。这失败了,因为我之前已经附加了该虚拟用户对象。我该如何检查?


这是我最终得到的结果,效果非常好:

public static void AttachToOrGet<T>(this ObjectContext context, string entitySetName, ref T entity)
    where T : IEntityWithKey
{
    ObjectStateEntry entry;
    // Track whether we need to perform an attach
    bool attach = false;
    if (
        context.ObjectStateManager.TryGetObjectStateEntry
            (
                context.CreateEntityKey(entitySetName, entity),
                out entry
            )
        )
    {
        // Re-attach if necessary
        attach = entry.State == EntityState.Detached;
        // Get the discovered entity to the ref
        entity = (T)entry.Entity;
    }
    else
    {
        // Attach for the first time
        attach = true;
    }
    if (attach)
        context.AttachTo(entitySetName, entity);
}

您可以按如下方式调用它:

User user = new User() { Id = 1 };
II.AttachToOrGet<Users>("Users", ref user);

这非常有效,因为它就像context.AttachTo(...)除非你每次都可以使用我上面引用的 ID 技巧。您最终会得到之前附加的对象或附加的您自己的对象。呼唤CreateEntityKey在上下文上确保它是好的和通用的,甚至可以使用复合键而无需进一步编码(因为 EF 已经可以为我们做到这一点!)。

编辑,十二年后(2021 年 12 月)……噢!

这是我在 EF Core 中使用的:

public static class EfExtensions
{
    public static T AttachToOrGet<T>(this DbContext context, Func<T,bool> predicate, Func<T> factory)
        where T : class, new()
    {
        var match = context.Set<T>().Local.FirstOrDefault(predicate);
        if (match == null)
        {
            match = factory();
            context.Attach(match);
        }

        return match;
    }
}

Usage:

var item = db.AttachToOrGet(_ => _.Id == someId, () => new MyItem { Id = someId });

您可以重构它以使用实体密钥,但这足以让任何人开始!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以检查对象是否已附加到实体框架中的数据上下文? 的相关文章

随机推荐

  • JPA/Hibernate 提高批量插入性能

    我有一个数据模型 该模型在 1 个实体和 11 个其他实体之间具有一对多关系 这12个实体一起代表一个数据包 我遇到的问题与这些关系的 多 侧发生的插入数量有关 其中一些可以有多达 100 个单独的值 因此要将整个数据包保存在数据库中 最多
  • git如何存储文件?

    我刚刚开始学习 git 为此我开始阅读Git 社区书籍 在这本书中他们说SVN和CVS存储文件之间的差异 而git存储所有文件的快照 但我不太明白他们所说的快照是什么意思 git 真的会在每次提交时生成所有文件的副本吗 因为这就是我从他们的
  • C++ 随机数

    在以下情况 http www fredosaurus com notes cpp misc random html 它提到如果我们想生成一个范围内的随机数1 10 我们可以执行以下操作 r rand 10 1 为什么我们要添加1 您能解释一
  • iPhone URL 编码问题

    有一个小问题 尝试将 XML 发布到服务器 为此 我必须以 URL 格式对 XML 字符串进行编码 NSString encodedString NSString stringWithFormat xmlValue post stringB
  • Bash Shell:无法使用变量 $ 作为运行 tar 的路径

    这是一个非常简短的问题 但是放置变量是否存在语法错误 example作为 bash 文件中 tar 的参数 我将文件写为 only portion that really matters bin bash tar cvpzf filenam
  • ItemCommand 在 Repeater 或 GridView 中第一次单击时不会触发

    这两天已经让我发疯了 希望有人以前见过这个 我遇到这样的问题 第一次单击中继器或网格视图中的控件无法触发 ItemCommand 事件 但所有后续单击都有效 控件被加载到 Base aspx 上的占位符中 如下所示 private void
  • Cordova Web视图在android中清除缓存

    我正在尝试清除存储在使用 cordova webview 的 android 应用程序中的缓存 我尝试过cordovaWebView clearCache true 还尝试过 public void deleteCache Context
  • uintptr_t 数据类型是什么?

    What is uintptr t它可以用来做什么 首先 在提出问题时 uintptr t不是用C 写的 它在 C99 中 在
  • 如何在 Android 中将颜色 LUT 应用于位图图像以获得滤镜效果?

    这里我有一个关于 android 中的 LUT 的问题 我的问题是 我有 4X4 LUT 使用这些 LUT 对 Android 中的位图图像应用滤镜效果 下面是我的示例 LUT 文件链接 Lut 链接示例 在安卓上可以实现吗 如果可以的话请
  • 如何在 Eclipse Juno/Kepler/Luna CDT 中启用 C++11?

    编辑 事实证明这确实不是 Eclipse Kepler 特有的 我必须对 Eclipse Juno 使用相同的过程 问题是 在回答同一问题的其他帖子中似乎缺少步骤 我正在使用 Eclipse Kepler for C 并尝试使用 C 11
  • 在 Linux 中混合使用 32 位和 64 位库 (gcc)

    我有一个为 Linux 使用 gcc 构建的 32 位纯二进制 C so 由供应商提供 我需要链接到 64 位 C C 应用程序 我正在开发 有什么方法可以从我的应用程序访问这个库吗 我知道需要小心处理 so 内部函数的参数和指针 而且我知
  • 如何将向量转换为Json对象? C++

    我有一个 RoomData 对象向量 这是该对象 typedef struct RoomData unsigned int id std string name std string maxPlayers unsigned int ques
  • setTimeout 循环。如何获得正确的订单

    我试图在循环中调用一个函数以实现不同的超时或延迟 for var i 0 i lt 10 i callDelayedFunction i function callDelayedFunction i setTimeout function
  • 将多个对象从 Angular 控制器发布到 Web API 2

    我能够从我的角度控制器发送一个原始 json 对象 该对象在我的 web api 方法中反序列化为已知类型 这很棒 但我现在需要能够在同一请求中发送其他参数 这些参数可以是 json 对象或简单类型 如 string 或 int 我看过类似
  • 同一域上的 CloudFront 静态网站和 EC2 API

    我的静态网站托管在 CloudFront 上 有没有办法让我使用相同的域名但不同的端口来调用 EC2 实例的 API Eg example com 3000应重定向到 EC2 实例 而example com aka example com
  • 通过隔行扫描加载图像 - 从低分辨率到全分辨率 - HTML

    我正在创建一个使用图像作为背景的网站 我讨厌从上到下加载图像 因为它只会使页面在加载时看起来很糟糕 我见过一些网站加载非常低分辨率的图像 然后逐渐提升到全分辨率照片 我希望我的网站也能这样做 但我不知道如何实现 这是否需要多个图像文件和更多
  • 从麦克风获取音频并将其写入 iOS 上的套接字

    这就是我想做的 从麦克风获取音频 采用 AAC G 711 或 G 726 编码 将编码帧写入套接字 我找到了很多例子 但它们都写入文件 您能否将我链接到任何具有输出缓冲区或回调的教程 文档 示例 库 我通过修改 Apple 的 Speak
  • 什么是 JAXB?为什么要使用它? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 这里有人发誓 JAXB 是自切片面包以来最伟大的东西 我很好奇 Stack Overflow 用户认为 JAXB 的用例是什么 以及是什么使它成为该用例的好或坏解决方案 我是用于操作 XM
  • JavaFX 和 Spring Boot - NPE

    我仍在与我的问题作斗争 我想使用 Spring Framework 来注入依赖项 并且必须使用 Spring boot 来集成两者 不幸的是 在第一个视图中 自动装配运行正确 但如果我进入下一个阶段 我仍然只能Null Pointer Ex
  • 是否可以检查对象是否已附加到实体框架中的数据上下文?

    当尝试附加已附加到给定上下文的对象时 我收到以下错误context AttachTo ObjectStateManager 中已存在具有相同键的对象 ObjectStateManager 无法跟踪具有相同键的多个对象 有没有一种方法可以实现