实体框架无法使用复合键更新表中的数据 (Oracle)

2024-04-26

我们有一个具有三列复合键的 Oracle 表。这些列通过实体框架数据模型正确映射到 C# 对象中。当我们从数据库中查询记录然后更新非键列时,我们总是收到一条错误消息,指出我们正在尝试更新主键(测试摘录如下):

var connection = new DbContextProvider(() => new DatabaseConnection()); 
var repo = new Repository(connection); 
var deltas = repo.Queryable<Deltas>().Where(d =>d.Volume.SubmissionId == 88921).ToList();
var deltaToUpdate = deltas.First(); 
deltaToUpdate.RecordedVolume = 0;
repo.Flush();  -- Does a context.SaveChanges() in background

我们总是收到以下信息:

System.InvalidOperationException:属性“COPY_ID”是 对象的关键信息,不能修改。

COPY_ID 是密钥的一部分,但它是 StoredGeneratePettern=Identity,并且在事务中不会更改。

任何帮助表示赞赏。

这是完整的堆栈:

System.InvalidOperationException:属性“COPY_ID”是 对象的关键信息,不能修改。 在 Data.Objects.EntityEntry.VerifyEntityValueIsEditable(StateManagerTypeMetadata typeMetadata,Int32 序号,String memberName)

在System.Data.Objects.EntityEntry.GetAndValidateChangeMemberInfo(字符串entityMemberName,对象complexObject,字符串complexObjectMemberName,参考StateManagerTypeMetadata typeMetadata,参考字符串changingMemberName,参考对象changingObject)

在System.Data.Objects.EntityEntry.EntityMemberChanging(字符串entityMemberName,对象complexObject,字符串complexObjectMemberName)

在 System.Data.Objects.EntityEntry.EntityMemberChanging(字符串实体成员名称)

在 System.Data.Objects.ObjectStateEntry.System.Data.Objects.DataClasses.IEntityChangeTracker.EntityMemberChanging(字符串实体成员名称)

在 System.Data.Objects.Internal.SnapshotChangeTrackingStrategy.SetCurrentValue(EntityEntry 条目、StateManagerMemberMetadata 成员、Int32 序号、对象目标、对象值)

在 System.Data.Objects.Internal.EntityWrapper`1.SetCurrentValue(EntityEntry 条目、StateManagerMemberMetadata 成员、Int32 序号、对象目标、对象值)

在 System.Data.Objects.EntityEntry.SetCurrentEntityValue(StateManagerTypeMetadata 元数据,Int32 序号,对象 userObject,对象 newValue)

在 System.Data.Objects.ObjectStateEntryDbUpdatableDataRecord.SetRecordValue(Int32 序号,对象值)

在 System.Data.Objects.DbUpdatableDataRecord.SetValue(Int32 序号,对象值)

在 System.Data.Mapping.Update.Internal.UpdateTranslator.SetServerGenValue(P ropagatorResult 上下文、对象值)

在 System.Data.Mapping.Update.Internal.UpdateTranslator.BackPropagateServerGen(列表`1生成值)

在 System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter 适配器)

在 System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager实体缓存)

在 System.Data.Objects.ObjectContext.SaveChanges(SaveOptions 选项) 在 System.Data.Entity.Internal.InternalContext.SaveChanges() 在 System.Data.Entity.Internal.LazyInternalContext.SaveChanges() 在 System.Data.Entity.DbContext.SaveChanges()

UPDATE我们跟踪了数据库交互,看起来以下 SQL 在数据库上成功运行,当它返回 EF 时,抛出错误(并且未提交更改):

declare 
"COPY_ID" number(10,0); 
"CODS_ID" number(10,0); 
"PERIOD_ID" number(7,0); 

begin 
  update "SCHEMA"."TABLE" 
  set "COLUMN" = :p0 
  where ((("COPY_ID" = :p1) 
  and ("CODS_ID" = :p2)) 
  and ("PERIOD_ID" = :p3)) 
  returning "COPY_ID", "CODS_ID", "PERIOD_ID" into "COPY_ID", "CODS_ID",  "PERIOD_ID"; 

  open :p4 
    for select "COPY_ID" as "COPY_ID", "CODS_ID" as "CODS_ID",           "PERIOD_ID" as "PERIOD_ID" 
  from dual; 
end; 

{ :p0=[Decimal,0,Input]0, :p1=[Int32,0,Input]222222, :p2=[Int32,0,Input]22222, :p3=[Int32,0,Input]222222, :p4=[Object,0,Output]NULL }

请包括:

  • 实体定义
  • 上下文中的映射类/配置
  • SQL表定义

反向传播服务器生成

查看堆栈跟踪,我看到的关键是BackPropagateServerGen.

实体框架正在针对数据库运行您的更新,但您的复合键值之一(可能是 COPY_ID)实际上已被 UPDATE 调用更改。该服务器生成的值从 SQL 调用返回,然后实体框架抱怨该键值正在从其下方更改。

因此,我猜测您的 COPY_ID 复合键值被定义为服务器生成的标识符,但其中一个或两个正在发生:

  • 您映射到的视图或存储过程会干扰实体框架对普通更新的期望
  • 表、视图或存储过程上有一个或多个触发器会干扰结果。

如果您有任何触发器,请暂时禁用它们,看看问题是否会停止。

如果要映射到视图或存储过程,请尝试直接映射到表(如果可能)。

使用您拥有的任何分析工具来捕获代码正在执行的 SQL。

Summary

我认为 UPDATE 调用实际上到达了数据库,但返回结果正在更改键值,导致实体框架失败,并可能回滚 UPDATE 事务(取决于您使用的 EF 版本)。

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

实体框架无法使用复合键更新表中的数据 (Oracle) 的相关文章

  • 在 C# 中枚举时从 List 中删除项目的智能方法

    我有一个经典的案例 尝试从集合中删除一个项目 同时在循环中枚举它 List
  • 内存数据库不保存数据

    我有一个简单的网络应用程序 在客户端有 Angular 在服务器端有 ASP NET Core Web API 我使用内存数据库 services AddDbContext
  • 使用 Entity Framework 6 强制两列之一不为 NULL

    我有一个如下表 Table tblStore public class Store Key DatabaseGenerated DatabaseGeneratedOption Identity public Guid Id get set
  • asp.net mvc 3 中模糊的远程属性验证

    asp net mvc 3 中的内置远程属性会执行 onchange 验证 我希望它在模糊时验证 有没有办法自定义它 或者还有其他东西可以这样做 我确信这是一个非常普遍的需求 你可以设置默认值 http docs jquery com Pl
  • 在 C++ 中从 std::string 转换为 char *

    我正在使用 VS2012 C 我需要将 std string 转换为 char 但我在网上找不到任何材料来提供有关如何执行此操作的任何指导 任何代码示例和建议将不胜感激 Use std string bla bla char blaptr
  • Lego Mindstorm NXT 的 C# 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有适用于 Lego Mindstorm NXT 的最新 C NET 库 NXT NET 乐高头脑风暴 最后更新时间 2008 年 4
  • 为什么我的程序循环太多次?

    我是 C 初学者 正在尝试创建一个程序 但我的主要功能有问题 Problem 在询问他们想要输入多少个整数 例如 4 个数字 后 循环进行 5 次 基本上输入 5 个数字 它还只在第二个数字之后打印 Next In my while循环 我
  • asp.net-mvc 中模型绑定双精度的 CultureInfo 问题(2)

    在我的 Jquery 脚本中 我使用浏览器的 CultureInfo en UK 发布了两个双打 该浏览器使用 作为分数分隔符 我的 MVC 应用程序在区域设置为 nl BE 的服务器上运行 使用 作为分数分隔符 AcceptVerbs H
  • C# 是否可以中断 ThreadPool 内的特定线程?

    假设我已将一个工作项排入队列ThreadPool 但是如果没有要处理的数据 从BlockingQueue 如果队列为空并且队列中不再有工作 那么我必须调用Thread Interrupt方法 如果我想中断阻塞任务 但是如何用 a 做同样的事
  • C++ 如何将对象向量声明为类的成员

    我正在尝试声明一个vector
  • 无法在 UWP 中调试 .NET Standard 2.0 DLL

    我创建了一个新的 Xamarin Forms 解决方案 升级了所有 NuGet 确保 UWP 版本的目标版本为 16299 并确保 NET Standard 项目的目标版本为 2 0 我运行了该项目并能够很好地调试 NET Standard
  • 如何使用 C# 从 Kafka 获取主题列表

    我想从卡夫卡获取主题列表 我正在使用 kafka net 客户端 但无法在有关获取主题列表的文档中找到 您可以使用 Confluence Kafka 包中提供的 AdminClient 列出所有主题 using Confluent Kafk
  • 如何使TabTip.exe窗口弹出时最大化

    我想使用以下代码弹出虚拟键盘 var info new ProcessStartInfo C Program Files Common Files Microsoft Shared ink TabTip exe info WindowSty
  • C# Null 传播运算符/条件访问表达式和 if 块

    The 空传播运算符 条件访问表达式 https roslyn codeplex com discussions 540883进来c 6 0 questions tagged c 23 6 0看起来是一个非常方便的功能 但我很好奇它是否有助
  • XNA:Unload() 的意义是什么?

    XNA 游戏有一个Unload 方法 其中内容应该被卸载 但这有什么意义呢 如果所有内容都被卸载 那么游戏一定会退出 在这种情况下 无论如何 所有内容都会被垃圾收集 对吗 据我了解 它对于任何标准用途都没有用 因为正如您所说 垃圾收集器为您
  • Windows.Automation 中的旧版 IAccessible

    如何使用C 获取AutomationElement的LegacyIAccessible State和其他LegacyIAccessibles 就像工具中的 Inspect exe 一样 The LegacyIAccessible是新的 并且
  • 退出失败设置错误代码

    我有一个 C Windows 程序无法设置退出代码 该程序非常复杂 我目前无法通过简单的测试用例重现该程序 我确实知道该程序调用exit 1 因为我在那一行有一个断点 在我跨过它之后 调试器 VS2010 立即打印The program p
  • 按值传递容器会使迭代器失效吗?

    这是一些示例代码 include
  • 无需动态分配的RSA实现

    典型的 RSA 实现包含一个多精度整数库 典型的多精度整数库使用动态分配将大整数表示为大小合适的机器字数组 我预计当使用多精度整数仅使用 RSA 2048 来加密或解密已知长度的消息 通常是对称加密密钥 时 可能会遇到数学整数的限制 并且它
  • 为什么 # 后面跟一个数字在 C plus plus 中似乎没有任何作用

    重现步骤 将以下行插入到 C 源代码的任意行中 1234 任何行 包括第一行 最后一行 甚至你也可以像这样在函数头和函数体之间输入 int foo 1234 return 0 数字可以很长 我测试了170多个字符 如果添加任何非数字字符 则

随机推荐

  • 如何从存储库中删除 Sonatype Nexus OSS(3) 组件

    这是我的第一个问题 我尽力做到最好 如果有什么问题 请简单地告诉我 我会纠正自己 我是 Sonatypes Nexus 3 OSS 的新手 我找不到从我的存储库中删除组件的方法 我的存储库中的一个包已变得无用 现在我想将其删除 我已经删除了
  • spring data neo4j 5 - 没有名为“sessionFactory”的bean可用

    我正在使用 spring data neo4j 5 0 7 RELEASE 和 spring 5 0 6 RELEASE 使用文档中的配置https github com spring projects spring data neo4j
  • 如何让 G1 打印更多日志详细信息?

    我正在测试基于 Jetty 的 API 与基于 Netty 的 API 实验中唯一的区别是我使用哪个 API 相同的应用程序 相同的服务器 相同的内存配置 相同的负载等 我使用基于 Netty 的 API 时会得到更长的 GC 暂停 大多数
  • React Native 上的 MQTT?

    将 MQTT 添加到我的反应原生项目时 我很难找到正确的方法 该项目需要在 iOS 和 Android 上运行 因此理想情况下 MQTT 可以在 javascript 端处理 我意识到移动节点和经典节点的网络巢穴是不同的 所以我开始沿着分叉
  • 自定义 Windows 7 登录 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何为 Windows 7 登录屏幕进行编程 不仅仅是替换背景图像 就像我希望它通过 RFID 阅读器进行身份验证一样 我能做到吗 我知道 XP 可
  • 经济模拟的算法?

    我想创建一个游戏 玩家可以创建不同价格的不同产品 称为报价 然后我给他们一定数量的客户 称为需求 现在 我想要一个算法来确定每个参与者的市场份额 当然 我现在就可以使用随机的方式来制作我的 但在这样做之前 我更愿意先问一下 因为我确信在我之
  • 我可以在css中指定maxlength吗?

    我可以用 CSS 中的某些内容替换 maxlength 属性吗
  • 如何根据文件名将文件移动到不同的目录?

    好的 我创建了一个程序 它将根据创建日期重命名目录中的文件 我现在需要能够根据创建日期将这些文件移动到不同的目录中 20131202 1 jpg 将进入名为 20131202 的文件夹 名为 20131203 2 jpg 的文件将进入名为
  • 如何在ios中获取今天日期的开始和结束时间? [复制]

    这个问题在这里已经有答案了 我使用此代码获取当前日期和时间 let today NSDate NSDate let dateFormatter NSDateFormatter NSDateFormatter dateFormatter ti
  • 多个网站,单点登录设计[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有个问题 我最近一直在做一些工作的一个客户有一系列具有不同登录机制的网站 他正在寻求慢慢迁移到单点登录他的网站机制 全部写在asp net m
  • 使用 Nodejs 和 body-parser 发布表单数据

    我现在已经进行了几次不同的在线尝试 但我的帖子数据一直未定义 并且 console log JSON stringify req body 也没有返回任何内容 所以我在某个地方出错了 HTML
  • SSE、内在函数和对齐

    我使用大量 SSE 编译器内在函数编写了一个 3D 矢量类 一切都工作正常 直到我开始使用 new 来实例化具有 3D 向量作为成员的类 我在发布模式下经历了奇怪的崩溃 但在调试模式下却没有 反之亦然 因此 我阅读了一些文章 并认为我需要将
  • 使用 pip 安装 pycrypto 失败

    我在尝试下载某个包时遇到了问题 C Python27 Scripts gt pip install pycrypto Collecting pycrypto Using cached https files pythonhosted org
  • gcc 中“-l”选项的放置

    我在放置时遇到一些问题 l使用时的选项gcc 这是一个用于重现问题的精简版本 t c include
  • 从数字字符串生成行

    我有一个 Oracle 18c 表 其中包含如下字符串 select 0 5 0 10 10 11 18 30 0 33 54 50 10 33 54 60 10 43 54 as multipart lines There are mor
  • 在 WPF 绑定中使用“真实”CultureInfo.CurrentCulture,而不是 IetfLanguageTag 中的 CultureInfo

    就我而言 我有一个 TextBlock 绑定到 DateTime 类型的属性 我希望它按照用户的区域设置显示
  • Maven:我应该保留还是删除声明的依赖项,这些依赖项也是传递依赖项?

    您认为删除 Maven pom 中可以找到的所有传递依赖项是一个好习惯吗 Example 我的项目依赖于A和B B 也是 A 的传递依赖 我应该将 B 保留在我的 pom 中还是将其删除 哪个最好 拥有所有已知的 jar 甚至是传递性的 j
  • Spark:将 bytearray 转换为 bigint

    尝试使用 pyspark 和 Spark sql 将 kafka 键 二进制 字节数组 转换为 long bigint 会导致数据类型不匹配 无法将二进制转换为 bigint 环境详情 Python 3 6 8 Anaconda custo
  • 如何使用 Objective-C 使文件在 Finder 中不可见

    如果可能的话 我需要使用 Objective C 或使用 C 调用将文件隐藏在查找器中以及聚光灯下 Thanks 您可以使用 chflags path to file UF HIDDEN 隐藏任何文件 See 手动更改标志 2 https
  • 实体框架无法使用复合键更新表中的数据 (Oracle)

    我们有一个具有三列复合键的 Oracle 表 这些列通过实体框架数据模型正确映射到 C 对象中 当我们从数据库中查询记录然后更新非键列时 我们总是收到一条错误消息 指出我们正在尝试更新主键 测试摘录如下 var connection new