实体框架 - 对唯一索引进行 UPSERT

2024-03-26

我对我的问题进行了一些搜索,但找不到任何真正有帮助的东西。

所以我的问题/困境仍然是这样的: 我知道 mysql 数据库有一个独特的索引系统,可用于使用以下格式在同一查询中插入/更新:insert into t(a,b,c) values(1,1,1) on duplicate keys update b=values(b),c=values(c);以及用于通过该索引替换现有记录的替换格式。

老实说,我在 MSSQL 中看到的唯一类似的东西是merge但我真的一点也不喜欢它,并且验证插入或更新的查询毕竟不是基于唯一索引的......

那么如何将 mysql 独特的 UPSERT 模拟到实体框架中呢?这是我的主要问题...

我的意思是没有从实体集中获取记录并检查它是否为空以进行可能的插入或更新;

我能得到它吗?或不?任何提示都可能有用

I saw this http://msdn.microsoft.com/en-us/library/hh846520(v=vs.103).aspx但没有出现在版本6中...

实体示例:

    [Table("boats")]
    public class Boat
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int id { get; set; }
        [MaxLength(15)]
        [Index("IX_ProviderBoat",1,IsUnique=true)]
        public string provider_code { get; set; }
        public string name { get; set; }
        [Index("IX_ProviderBoat", 3, IsUnique = true)]
        [MaxLength(50)]
        public string model { get; set; }
        [Index("IX_ProviderBoat", 2, IsUnique = true)]
        [MaxLength(15)]
        [Key]
        public string boat_code { get; set; }
        public string type { get; set; }
        public int built { get; set; }
        public int length { get; set; }            
    }

所以我想使用 EF 根据我的 IX_ProviderBoat 唯一索引进行更新/插入


The AddOrUpdate方法是以下成员IDBSet并且在 EF6 中可用。

The AddOrUpdate方法不是原子操作,多线程调用不保证第二个线程Update代替Add再次使用 - 这样您就可以存储重复的记录。

此示例经过测试并符合您的期望:

        Boat boat = new Boat // nullable fields omitted for brevity 
        {
            boat_code = "HelloWorld",
            id = 1,
            name = "Fast Boat",
            built = 1,
            length = 100
        };

        using (BoatContext context = new BoatContext()) // or whatever your context is
        {
            context.Set<Boat>().AddOrUpdate(boat); // <-- IDBSet!!!
            context.SaveChanges();
        }

如果我们改变boat_code the AddOrUpdate()方法将添加一条新记录。如果boat_code是 'HelloWorld` 它将更新现有记录。我相信这就是您正在寻找的......

希望这可以帮助!

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

实体框架 - 对唯一索引进行 UPSERT 的相关文章

  • 以编程方式最大化屏幕一半的窗口

    我想最大化屏幕左侧的随机窗口 我可以在我的代码中使用 Windows Aero 函数吗 这个窗口can像用鼠标一样最大化 我只想以编程方式做到这一点 I use C 我可以得到IntPtr窗户的 如果可能的话 不要伪造鼠标或键盘输入 这可以
  • Attachconsole的问题

    我需要使 Windows GUI 应用程序可以在控制台中运行 因此当使用命令行调用应用程序时 我将控制台附加到进程 但是 应用程序退出后 除非按 ENTER 键 否则不会显示带有路径的控制台提示符 有什么办法可以不按回车键直接显示路径提示吗
  • 如何使用 Windows 粘贴命令将文本粘贴到 C# 中的其他应用程序?

    如何调用互操作来使用 Windows Pastse 命令将文本粘贴到 C 中的其他应用程序 调用互操作 我的意思是如何对 C 进行编程相同的右键单击粘贴文本 在某些情况下这可能有点棘手 但实际上非常简单且容易做到 下面的示例介绍了如何使用文
  • 在实体框架中附加集合

    使用实体框架 我可以使用附加单个对象 entity Attach 但是 我没有看到任何方法允许我将多个对象的集合 数组添加到实体 我必须循环遍历集合中的每个项目并调用entity Attach 每一次 是的 您必须循环遍历子集合并Attac
  • 如何在 CUDA 中执行多个矩阵乘法?

    我有一个方阵数组int M 10 以便M i 定位第一个元素i th 矩阵 我想将所有矩阵相乘M i 通过另一个矩阵N 这样我就收到了方阵数组int P 10 作为输出 我看到有不同的可能性 分配不同元素的计算M i 到不同的线程 例如 我
  • 如何序列化其类相互引用的类层次结构,但避免 XmlInclude?

    我有一个类的层次结构 我想使用XmlSerializer类及其相关属性 有一个基本抽象类 然后是相当多的派生类 在下面的代码中 我已将派生类的数量减少到五个 但实际代码中还有更多 这些类形成一个层次结构 并且经常包含对层次结构中类的实例的引
  • 如何在 C# winforms 中翻译文本

    我需要翻译一些文本 我正在尝试使用谷歌翻译器来翻译它 我检查了这个article http martinnormark com translate text in c using google translate 但我在以下代码中遇到异常
  • 在iOS中,在纯C中,这是获取本地文件路径的方法吗?

    我需要最终得到一个 cstring 作为捆绑包中文件的本地路径 First include
  • 选择另一个表连接的每行的最小值

    我有下表 Table1 Table2 CardNo ID Record Date ID Name Dept 1 101 8 00 11 7 2013 101 Danny Green 2 101 13 00 11 7 2013 102 Tan
  • C++ Boost.asio Ping

    我正在尝试编写一个程序来列出网络上设备的所有 IP 地址 其主要组成部分之一是能够对设备执行 ping 操作 这个程序必须在Linux Windows和Mac上运行 所以我选择了Boost库 我设法在文档中找到这个示例 http www b
  • std::function 和 std::bind 行为

    我有这个代码 include
  • EF Core:同时使用ID作为主键和外键

    我有两个实体 Prospect and Person 我想做的是使用Prospect ID作为主键Prospect表并作为外键PersonID 我的想法是对两个实体使用相同的 ID 而不需要PersonID on my Prospect实体
  • 无法打开作为链接添加的 configSource 文件

    在我的 MVC 应用程序中 我使用外部配置文件来保持干净的 web config 有些文件很常见 我将它们作为链接从一个位置添加到项目中 对于这些文件 我将 复制 选项设置为 始终复制 这些文件将被复制到目标文件夹 我会看到它们 但是当我尝
  • 使用 mkl_malloc 进行内存对齐

    这个问题可能只是表明我还没有理解 C 中的一些重要内容 Intel Math Kernel 库提供了一种在分配内存时设置内存对齐的方法 另一方面 我只是通过引用将数组传递给 mkl lapack 例程 那么 lapack 例程如何知道数组的
  • 未初始化的枚举变量值

    我使用 enum 声明新类型 DAY 然后从中声明两个变量 day1 和 day2 然后当我使用未初始化的值时 我应该看到 0 到 6 之间的值 因为 enumlist 中的值介于 0 到 6 之间 但我收到了这些值改为 858993460
  • 将文本文件与 C# 中的文本模式进行比较?

    我将文本文件与类似的模式进行了比较 它正在将整行写入日志 如下所示 insert into depdb fin quick code met 但我需要单独写这个depdb或者depdb fin quick code met 即 我只需要这个
  • 推导具有两个以上参数的 std::function

    我想知道为什么std function http en cppreference com w cpp utility functional function只知道有两个参数的函数 我已经编写了一些运行良好的代码 但存在许多限制 欢迎任何反馈
  • 有条件地使用按位运算符

    条件运算符如何使用按位运算符表示 这是一个家庭作业问题 我必须仅使用按位运算来实现条件运算符 那就很简单了 如果if允许使用语句 但它必须是严格的按位运算符 仅运营商 gt gt and lt lt 可以使用 不if可以使用语句或循环 该函
  • __get_cpuid 的可移植性如何?

    我在用着 get cpuid 获取有关的信息x86 and x86 64我的程序运行的处理器 在 Linux 和 Mac OS 上使用 GCC 似乎可以在不包含任何头文件的情况下编译和运行 但是它的可移植性如何 它可以与其他编译器一起使用吗
  • 如何在 asp.net 中用空字符串替换字符串中的任何“/ \\ [ ] : | < > + = ; , ? *”字符

    我想用 asp net c 中的空字符串替换字符串中出现的任何以下字符 我正在尝试将其替换为 mystring contains mystring Replace 目前我正在按照上面的方法进行 有没有更干净的方法来做到这一点 感谢致敬 有很

随机推荐

  • Android Studio 3.2.1,XML 错误缩进格式

    更新到 Android Studio 3 2 1 后 XML 文件格式非常烦人和糟糕 我们该如何修复它 我们可以将其从设置中的某处更改为预览类型吗 在 Android Studio 3 上 转到 首选项 gt 编辑器 gt 代码样式 gt
  • Eclipse 中源的相对路径

    所以 Eclipse 和相对路径 我想要实现的是与多个用户共享项目文件 其中每个用户的源的确切位置可能不同 即 项目 MyProject 的 src 可能位于c version control foo MyProject src or c
  • 操作栏 sherlock 库中显示空指针异常

    我想实现 Sherlock 操作栏的搜索视图小部件 我的问题是OnOptionItemSelected搜索视图项目的 我在库活动中遇到空指针异常 菜单 XML
  • WPF 复选框绑定

    虽然使用复选框的 Click 事件将复选框的选中状态存储在变量中很简单 但我如何通过数据绑定来做到这一点 我发现的所有示例都从某个数据源更新了 UI 或者将一个控件绑定到另一个控件 我想在单击复选框时更新成员变量 TIA 的任何指示 您必须
  • Secure Com SCP02 会话:响应初始化更新命令返回的“密钥多样化数据”的作用是什么

    在初始化更新命令的响应字段中 密钥多样化数据 包含制造商ID和安全域AID的最后两个字节 被返回到Off Card实体 我想知道这些数据的用途是什么 我在某处读到 该密钥多样化数据用于派生卡外的基本密钥 我不知道这是对还是错 如果是正确的
  • 如何将 libxml2 与 CMake 一起使用?

    我正在为我的 C 项目使用 CLion 编辑器 带有 CMake 不过我从未使用过外部库 我的问题是如何将外部库 例如 libxml2 链接到我的项目 我见过一些与此类似的问题 但没有一个对我有用 我的项目是在 Windows 上编译的 我
  • 使用predict()函数时出错

    我应该将输出转换为ar ols成为某种类型predict可以接受吗 y rnorm 100 0 1 z rnorm 100 0 1 yz cbind y z gt output ar ols yz aic F order max 2 dem
  • GIT 命名我的存储库

    我正在跟进本指南 http progit org book ch4 2 html它说要跑的地方 git clone bare stef project stef project git I get fatal repository stef
  • linux下用boost::thread创建boost::asio工作线程

    我在 Windows 下使用 boost 一段时间了 现在需要迁移几个现有的应用程序以在 Ubuntu 12 上运行进行演示 该应用程序创建两个工作线程 一个用于记录传入的 UDP 数据 另一个用于侦听单独的端口并将该数据打印到屏幕上 我已
  • 有没有办法从 Excel VBA 中的轴导出图表?

    我有许多用于操作 Excel 图表的通用 VBA 宏 例如 将一个图表叠加在另一个图表之上 重新缩放轴 或者通过键入公式向图表添加自定义曲线 例如 y x 2 1 在文本框中 这些宏是不带任何参数的子宏 我将它们存储在 xlam 加载项中
  • 包含按位与 (&) 或按位异或 (^) 的运算是否有等价的十进制?

    考虑以下表达式 其中两个操作数都是十进制 a b or a b 我知道运算符对操作数的二进制数字执行什么操作 因此我知道答案如何 的a b or a b被计算 我不知道这些运算是否可以转换为十进制形式 例如 我们可以说a lt
  • 将 std::unique_ptr 保存为不完整类型的类的构造函数定义之间的差异

    下面的代码编译正常 参见下面的 Golbolt 链接 include
  • Ruby:递归方法

    def reverse append arr n return arr if n lt 0 reverse append arr n 1 arr lt lt n arr end reverse append 4 gt 0 1 2 3 4 我
  • 我怎样才能在edittext中的每个字符下划线?

    我正在尝试在android中编写一个像刽子手这样的猜词游戏 假设这个词是 苹果 我想显示 5 个下划线来告诉玩家该单词有 5 个字符长 并且它们应该如下显示 填充 我想不出有什么办法可以轻松做到这一点 我发现this https stack
  • MaterialComponents 中 android:background 的替代品是什么?

    问题 android background 在 MaterialComponents 中没有生效 在我的项目中 我使用的是 AppCompat
  • 根据项目更改列表视图行的颜色

    我想根据列表视图的状态更改其颜色 我有两个状态 我想将 待处理 更改为红色 将 完成 更改为蓝色 这怎么可能 我不知道 因为这是我第一次在列表视图中执行此操作 也许是这样的 Dim ListView1 As ListView New Lis
  • 如何在 iOS 上从相机胶卷中检索最新的照片?

    我很难弄清楚如何在没有用户干预的情况下以编程方式检索相机胶卷中的最新照片 需要明确的是 我不想使用图像选择器 我希望应用程序在打开时自动抓取最新的照片 我知道这是可能的 因为我见过类似的应用程序可以做到这一点 但我似乎找不到任何相关信息 一
  • 捕获父容器上的单击事件,但不捕获子容器上的单击事件

    用下面的例子 HTML div class parent div class child div div CSS parent align items center background blue display flex justify
  • 如何在 Flutter 中使用另一个提供程序内部的提供程序

    我想创建一个具有以下功能的应用程序authentication service根据用户角色具有不同的权限和功能 例如消息 所以我创建了一个Provider用于用户和登录管理 另一个用于用户可以看到的消息 现在 我想在用户登录时获取消息 一次
  • 实体框架 - 对唯一索引进行 UPSERT

    我对我的问题进行了一些搜索 但找不到任何真正有帮助的东西 所以我的问题 困境仍然是这样的 我知道 mysql 数据库有一个独特的索引系统 可用于使用以下格式在同一查询中插入 更新 insert into t a b c values 1 1