首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我保存我的新EF对象时,现有的相关对象被再次创建

当保存新的EF对象时,现有的相关对象被再次创建的原因可能是由于EF的跟踪机制。EF使用对象上下文来跟踪对象的状态和变化。当保存一个新的EF对象时,EF会检查该对象的关联属性,并将相关对象标记为“未更改”状态。如果这些相关对象在保存之前已经存在于数据库中,EF会认为它们是已经存在的对象,并不会再次创建。但是,如果这些相关对象在保存之前是新创建的,EF会将它们标记为“已添加”状态,并在保存时将它们插入到数据库中。

在EF中,可以通过以下几种方式来解决这个问题:

  1. 使用Include方法加载相关对象:在查询数据时,使用Include方法来显式加载相关对象,这样EF会将它们标记为“已加载”状态,而不是“未更改”状态。这样,在保存新的EF对象时,EF会正确地将它们标记为“已添加”状态,而不是再次创建。
  2. 使用Attach方法附加相关对象:在保存新的EF对象之前,使用Attach方法将相关对象附加到对象上下文中。这样EF会将它们标记为“未更改”状态,而不是“已添加”状态,从而避免再次创建。
  3. 使用Find方法查找已存在的对象:在保存新的EF对象之前,使用Find方法查找数据库中已存在的相关对象。如果找到了匹配的对象,可以将其关联到新的EF对象上,而不是创建新的对象。

总结起来,当保存新的EF对象时,现有的相关对象被再次创建的问题可以通过显式加载相关对象、附加相关对象或查找已存在的对象来解决。这样可以避免重复创建对象,提高性能和数据一致性。

腾讯云相关产品和产品介绍链接地址:

  • 云数据库 TencentDB:https://cloud.tencent.com/product/cdb
  • 云服务器 CVM:https://cloud.tencent.com/product/cvm
  • 云原生应用引擎 TKE:https://cloud.tencent.com/product/tke
  • 云存储 COS:https://cloud.tencent.com/product/cos
  • 人工智能 AI:https://cloud.tencent.com/product/ai
相关搜索:为什么django模型不能保存我的新对象时,我点击创建按钮在'create.html‘为什么我的函数每次被调用时都会创建一个新对象?我们初始化主对象,然后它在其构造函数中创建一个新对象。当我们销毁主对象时,它的创建会发生什么?为什么我的对象在我创建它、保存它并想要警告它时没有警告?当我创建@ManyToOne对象时,我应该将该对象添加到关系的另一边的列表中吗?我正试图在我的Playstate中创建一个对象AllBalls,但是当我试图初始化对象时,我得到了一个错误当我从一个扩展了特定接口的类创建一个对象时,我可以在使用这个接口的地方使用这个对象吗?当我必须选择性地使用http Observable或变量时,我是否可以从我的服务创建一个可观察对象?为什么当我继承了“母亲”类时,当访问说明符被设置为私有时,我不能在“孙女”类中创建“母亲”类对象?当给定一个具有两个同级属性的对象时,如何使用jq创建一个新对象,其中同级属性被移动为子属性?我应该如何重置所有的对象,事实上,整个世界在重新开始一个新的游戏时,它的原始状态?新的编码:如果radioButton没有被检查,它会说它不是,所以你不能完成创建对象的过程,我该怎么做呢?每当我尝试调用我在另一个react本机应用程序中创建的ReactNativeLibrary时,我都会收到“未定义的不是对象”的消息我正在使用动态表单从表单中检索值,但是当我通过控制台记录从表单中的值创建的对象时,我得到了未定义的值当我在C++中派生一个类时,它是否创建了一个基类对象并将其作为我的成员变量存储在派生类中?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

EF简介

ORM: 广义上:ORM指的是面向对象的模型和关系型数据库的数据库之间的相互转换; 狭义上:ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟的面向对象的数据接口。 ?...之后里面是没有代码的,但是在ef4.0的时候是有的,那个时候里面存放的是数据库上下文和数据库对应的表实体,如果你需要使这个(对应ef模块名.Designer.cs文件)文件里面的文件重现,你只需要找到对应的数据库模型...1、当使用上下文操作数据库表时,被操作表必须含有主键,否则回报错。...错误的原因我们来分析下: 经过调试代码我们发现,当我们第一次new T_ConsultingList对象时,这个对象为空,当我们使用ef添加完数据后,再去观察这个对象我们会发现,这个对象里面已经有值了,...而里面的值就是我们刚才所添加的值,说明在我们执行完数据库添加操作之后,数据库里面的数据马上将我们所添加的数据马上映射给了当前的实体对象,所以当我们在下面指定需要修改的记录的主键时,如果修改和添加共用同一个对象

1.4K80

EF 相见恨晚的Attach方法

一个偶然的机会,让我注意了EF 的Attach方法,于是深入了解让我大吃一惊 在我所参与的项目中所有的更新操作与删除操作都是把原对象加载出来后,再做处理,然后再保存到数据库,这样的操作不缺点在于每一次的操作都要对数据库进行两次操作...状态附加到上下文中 从解释可以看出Attach方法主要目的就是把一个没有被dbContext跟踪的对象附加到dbCotext中使其被dbContext跟踪  1   对象上下文:DBContext 建一个新的上下文实例以创建将连接到的数据库的名称...,默认状态是没有对任何对象跟踪的  2   实体状态:  在EF中对实体状会有4种状态:       2.1  Added:对象为新对象,并且已添加到对象上下文,但尚未调用    2.2  Deleted...,或自上次调用 (调用了SaveChange方法后所有的对象都改为Unchanged状态) 了解了相关的知识后就开始利用Attach方法改代码了 以上为原来的方法  using(Entities ctx...的处理方式如下 // 1 把对象附加到上下文中,并把状态改为Modified状态 // 2 调用Savechange方法时生成一段Update的SQL语句且Where 条件 // 为对象的主键Id

1.4K40
  • 求知 | 聊聊Android资源加载那些事 - Resource的初始化

    ,所以当我们要找 Activity 中 resource 在哪里被初始化时,也即是在找: -> ContextImpl.resource 在哪里被初始化?...否则先使用当前 activity 对应的配置 创建一个 [旧]配置对象,接着去更新该 activity 所有的 resources 具体实现类impl。...总结 当我们在 Activity、Fragment 中调用 getX() 相关方法时,由于 context 只是一个代理,提供了获取 Resources 的 getx() 方法,具体实现在 ContextImpl...➡️ LoadedApk.getResources() 当我们获取 resources 时,内部会先判断是否存在,如果不存在,则调用 ResourcesManager.getResources() 去获取新的...结语 最终,让我们反推上去,总体再来回顾一下 Resources 初始化的相关: 原来我们的 resources 都是在 context 创建时初始化,而且我们所调用的 resources 实际上被 ActivityResource

    43010

    Entity Framework快速入门--直接修改(简要介绍ObjectContext处理机制)

    让我们所有的操作都只通过这个一个实体上下文就可以实现了增删查改等所有对应数据库的操作。当然,我们要了解EF的生成SQL的机制我们才能更好的使用EF帮我们生成效率更高的SQL脚本。...标志我们开发人员对实体的相应的操作,如下表格是实体的相关状态以及说明(摘自MSDN) 成员名称 说明 Detached 对象存在,但没有被跟踪。...在创建实体之后、但将其添加到对象上下文之前,该实体处于此状态。...Added 对象为新对象,并且已添加到对象上下文,但尚未调用 SaveChanges 方法。 在保存更改后,对象状态将更改为 Unchanged。...而且EF自动帮我们做了缓存的处理,当我们第一次查询某个实体时它会自动帮我们从数据库取出数据,并装配成实体类交给我们开发人员,当第二次获取相同数据时,它会先从缓存中查找,如果已经存在数据了就立即返回,不会查询数据库

    80830

    一文读懂字符串String

    不可变对象是在完全创建后其内部状态保持不变的对象。这意味着,一旦对象被赋值给变量,我们既不能更新引用,也不能通过任何方式改变内部状态。...(str1 == str2); 采⽤字⾯值的⽅式创建⼀个字符串时,JVM⾸先会去字符串池中查找是否存在"abc"这个对象的引⽤ 如果不存在,则在堆中创建"abc"这个对象,并将其引⽤添加到字符串常量池(...但是,既然字符串是不可变的,那么字符串拼接又是怎么回事呢? 字符串不变性与字符串拼接 其实,所有的所谓字符串拼接,都是重新生成了一个新的字符串。...下面一段字符串拼接代码: String s = "abcd"; s = s.concat("ef"); 其实我们最后得到的是一个新字符串,如下图: s保存的是一个重新创建出来的String对象的引用。...,不会创建新对象,拼接字符串的效率⾼.

    53220

    124-R编程18-R的内部机制2

    , 但是每个元素指向的元素值对象不变, 仍与x的各个元素指向的对象相同;然后, y[[3]]指向的元素值进行了重新绑定, 不再指向x[[3]], 而是指向新的保存了值0的对象, 但y的其它元素指向的对象仍与...在R的3.1.0之前则用的深拷贝方法, 即复制列表时连各个元素保存的值也制作副本。...★当我们查找一个符号(变量)时,如果它在当前环境中,R就会在当前环境中搜索并返回该符号指向的对象。如果这个符号在当前环境中没有找到,R就会到它的父环境中搜索。...父环境 当我们查找一个符号(变量)时,如果它在当前环境中,R就会在当前环境中搜索并返回该符号指向的对象。如果这个符号在当前环境中没有找到,R就会到它的父环境中搜索。...(e2) ef0> ef0> 在R 赋值中我提到过,<<- 表示在各级父环境中赋值,最先在那一层父环境中找到变量就在那一层中赋值

    64650

    Entity Framework 4.1 Code-First 学习笔记

    EF 将会创建一个名为 dbo.EdmMetadata 的表,然后将模型结构的 Hash 保存到其中来实现。   如果数据库不存在,EF 将会创建它,创建什么数据库呢?...这一点可以理解,最小长度会在数据存储时进行验证,如果小于2将会抛出异常,无法完成保存。   ...同样的道理,当你获取一个实体的时候,即使所有的属性都是 null ,EF4.1 也将会创建一个复杂类型的对象。...整个的层次被展开到一张表中,基类中没有的属性被自动标记为可空。...还有一个额外的区分列,用来保存数据是属于哪一个类,当 EF 读取一行的时候,区分列被 EF 用来知道应该创建实例的类型,因为现在所有的类都被映射到了一张表中。

    1.6K10

    聊聊Git原理

    随着项目的进行,我们创建的文件,以及一些操作记录,都会作为Git对象被存储在这个目录下。...在该目录下,所有对象都会生成一个文件,并且有对应的SHA-1校验和,Git会创建以校验和前两位为名称的子目录,并以剩下的38位为名称来保存文件。...Hash值直接存入tree对象,对于有修改的文件,则会生成一个新的对象,将新的对象存入tree对象。...,当我们切换分支后再次进行提交操作时,Git就会读取HEAD对应引用的值,作为此次commit的parent。...前文介绍过,当文件修改后进行提交时,Git会创建一份新的快照。这样长久下去,必定会占用很大的存储空间。而比较古老的版本的价值已经不大,所以要想办法清理出足够的空间供用户使用。

    39050

    【译】MongoDB EF Core 提供程序:有什么新功能?

    在这篇文章中,我们将使用 MongoDB EF Core 提供程序和 MongoDB Atlas 来展示以下内容: 向实体添加属性并进行更改跟踪 利用出口创建索引 执行复杂查询 事务和乐观并发 与本博客相关的代码可以在...接下来,让我们在刚刚添加的两行代码中添加一个断点,以确保我们可以在继续操作时实时跟踪更改。选择“开始调试”按钮来运行应用程序。当第一个断点被击中时,我们可以看到本地字段值已被分配。...索引管理 MongoDB EF Core 提供程序建立在现有的 .NET/C# 驱动程序之上。...我们可以将数据库创建移到变量中,这样我们就不必再次定义数据库的名称。有了这个新上下文,让我们为电影添加续集并将其添加到 DbSet。...我们还将添加第三部分(是的,这是三部曲),但使用与第二部电影实体相同的 ID 到这个新上下文,然后保存我们的更改。

    7110

    云原生技术之docker学习笔记(5)

    可以得到一个结论,mysqld进程在容器里面和容器外面执行的结果不一样。 为什么会这样? 其本质是docker容器中的进程被隔离在了一个新的环境中,使得这些进程只能看到重新计算过的PID号。..., SIGCHLD, NULL); 它返回的就是我们创建的进程的PID号。...而Namespace技术就是在Linux创建进程的时候,多了一个参数,这个新参数暂且称之为newid,这样,在容器内,我们看到的进程的PID号,就是这个newid了。...当然,不是所有的资源都能够被namespace化,例如时间和操作系统内核,就是一个服务器上的所有容器共享的。...docker容器是由镜像实例化而来的,这和我们学习的面向对象的概念十分相似,我们可以把镜像想象成类,把容器想象成类经过实例化后的对象,这样就非常好理解镜像和容器的关系了。

    38210

    Java编程思想读书笔记(一)【对象导论】

    作为母校的教材(英文版),当我再次捧起这本书(中文版)的时候,我已不再是学生,以此系列文章记录自己的感悟与收获。...我们称其为“创建一个成员对象”。 因为是在使用现有的类,所以这种概念被称为组合(composition),如果组合是动态发生的,那么它通常被称为聚合(aggregation)。...单根继承结构保证所有对象都具备某些功能。 单根继承结构使垃圾回收器的实现变得容易得多。 1.9 容器 容器: 创建另一种对象类型。这种新的对象类型特有对其他对象的引用。...参数化类型机制的原因:要创建知道自己所保存的对象的类型的容器,不需要向下转型以及消除犯错误的可能。 在Java中,参数化类型称为泛型。...1.10 对象的创建和生命期 在使用对象时,最关键的问题之一便是它们的生成和销毁方式。 每个对象为了生存都需要资源,尤其是内存。

    26440

    应该在项目中使用EF Core吗?

    是除了官方文档外另一个学习EF Core的不错途径, 书中由浅入深的讲解的EF Core的相关知识。因为没有中文版,所以本人对其进行翻译。...学习和使用新的类库都是有成本的,特别是像EF Core这样庞大复杂的库 我会给你一个详细的答案,正如你接下来看到的,我想更直观的描述....我认为它的API改进的很好 如果你正在启动一个新的项目,并且.NET Core和EF Core适用于你的项目,那么使用EF ore意味着你不会落后 跨平台与开源 我在开章开始的时候提到EF Core支持跨平台...这是我使用EF的主要原因之一 EF Core对开发人员很友好,即使我没有编写最良好的代码也往往会创建有效的查询....我建议你EF Core docs网站的功能比较页 http://mng.bz/ek4D, 在这里可以了解到最新的进展 稳定的类库 当我开始写这个书时,EF Core还不稳定.

    1K40

    画说 Ruby 与 Python 垃圾回收

    可用列表 当我们执行上面的*Node.new(1)*时,Ruby到底做了什么?Ruby是如何为我们创建新的对象的呢? 出乎意料的是它做的非常少。...当我们调用 Node.new,Ruby只需取一个预创建对象给我们使用即可: ? 上图中左侧灰格表示我们代码中使用的当前对象,同时其他白格是未使用对象。(请注意:无疑我的示意图是对实际的简化。...当我们创建第二个对象的时候,再次像OS请求内存: ? 看起来够简单吧,在我们创建对象的时候,Python会花些时间为我们找到并分配内存。 Ruby开发者住在凌乱的房间里 ? 回过来看Ruby。...随着我们创建越来越多的对象,Ruby会持续寻可用列表里取预创建对象给我们。因此,可用列表会逐渐变短: ? 或者更短: ? 请注意我一直在为变量n1赋新值,Ruby把旧值留在原处。"...在内部,创建一个对象时,Python总是在对象的C结构体里保存一个整数,称为 引用数。期初,Python将这个值设置为1: ? 值为1说明分别有个一个指针指向或是引用这三个对象。

    70910

    JavaScript 内存泄露的4种方式及如何避免

    window 对象总是存在,因此垃圾回收器可以检查它和它的所有子对象是否存在(即不是垃圾); 所有的 roots 被检查和标记为激活(即不是垃圾)。所有的子对象也被递归地检查。...三种类型的常见 JavaScript 内存泄露 1:意外的全局变量 JavaScript 处理未定义变量的方式比较宽松:未定义的变量会在全局对象创建一个新变量。...显而易见,周期性的内存泄露很容易发现;偶现的泄露比较棘手,一般容易被忽视,偶尔发生一次可能被认为是优化问题,周期性发生的则被认为是必须解决的 bug。 以 Chrome 文档中的代码为例: ?...而后再次点击 The Button 按钮,等数秒以后,保存第二个快照。 ?...此例很容易找到内存泄露,看下 (string) 的 Size Delta Constructor,8MB,58个新对象。新对象被分配,但是没有释放,占用了8MB。

    4.8K52

    在Entity Framework中使用存储过程(四):如何为Delete存储过程参数赋上Current值?

    关于文中涉及的这个问题,我个人觉得是EF一个有待改进的地方,不知道各位看官是否同意?...粗略地想想,EF这样设计也无可厚非:Insert存储过程用于添加一条全新的记录,自然应该采用当前值;而Delete存储过程用于删除一条现有的记录,删除操作的筛选条件自然应该使用原始值。...这是一个很常见的需求,为此我们可以直接在T_CONTACT的数据表中添加一个新的字段:LAST_UPDATED_BY,创建该表的DDL定义如下: 1: CREATE TABLE [T_CONTACT...但是,由于Delete存储过程默认使用的是实体对象的初始值,即使你在删除之前为Contact对象的LastUpdatedBy属性设置了新的值,该值也不可能传入到存储过程中去。...所以,我个人觉得这是EF一个值得改进的地方,让Delete存储过程和Update一样,也可以指定不同的版本。

    1.8K100

    Vue3 源码解析(八):ref 与 computed 原理揭秘

    ref 当我们有一个独立的原始值,例如一个字符串,我们想让它变成响应式的时候可以通过创建一个对象,将这个字符串以键值对的形式放入对象中,然后传递给 reactive。...当我们通过 ref.value 的形式读取该 ref 的值时,就会触发 value 的 getter 方法,在 getter 中会先通过 track 收集该 ref 对象的 value 的依赖,收集完毕后返回该...或者它也可以使用具有 get 和 set 函数的对象来创建一个可写的 ref 对象。...,这就可以保证如果 computed 中的依赖没有发生变化,则副作用函数不会再次执行,那么在 getter 时获取到的 _dirty 始终是 false,也不需要再次执行副作用函数,节约开销。...如果想继续追踪后续文章,也可以关注我的账号或 follow 我的 github,再次谢谢各位可爱的看官老爷。

    1.9K40

    孔乙己的疑问:单例模式有几种写法

    当单例对象有必要实现 Serializable 接口时,即使将其构造函数设为私有,在它反序列化时依然会通过特殊的途径再创建类的一个新的实例,相当于调用了该类的构造函数有效地获得了一个新实例!...因此当我们的单例对象实现了 Cloneable 接口时,尽管其构造函数是私有的,仍可以通过克隆来创建一个新对象,单例模式也相应失效了。 优点:写法比较简单,在类装载的时候就完成实例化。...Enum是没有clone()方法的 枚举类类型是 final 的「不可以被继承」 构造方法是私有的「也只能私有,不允许被外部实例化,符合单例」 类变量是静态的 没有延时初始化,随着类的初始化就初始化了「...注意在Application中存取数据 在Android 应用启动后、任意组件被创建前,系统会自动为应用创建一个 Application类(或其子类)的对象,且只创建一个。...因为Application 不会永远驻留在内存里,随着进程被杀掉,Application 也被销毁了,再次使用时,它会被重新创建,它之前保存下来的所有状态都会被重置。

    67630

    基础面试,为什么面试官总喜欢问String?

    再次提醒一下,所有 new 的对象都会在 Heap 中,这样以后你就好区分了 运行期字符串留驻 上面说的字符串留驻是在编译期,那么运行期可以吗?...)的作用了,通过调用 intern()方法,就好比把创建的字符串拘留在方法区一样了 在面试时甚至还会问你下面代码创建了几个对象: String d = new String("abcd") 如果方法区已存在...当我们想在字符串 s 后面拼接字符"ef"时,会在堆中创建一个新的对象,并将 s 的引用指向新创建的对象,由于 String 创建的是不可变对象,所以 String 类中的所有方法都不会改变它自身,而是返回一个新的字符串...或者 StringBuilder,否则,由于每次操作字符串都会创建一个新的对象,而旧的对象不会有引用指向它,这样我们会浪费很多垃圾回收的时间 到这里还没完,你有没有想过为什么 String 会被设置/...当创建一个字符串时,如果该字符串已经存在于池中,那么返回现有字符串的引用,而不是创建一个新对象。

    47310

    Git内部存储原理

    该命令会在工作目录下生成一个.git目录,该目录将用于保存工作区中所有的文件历史的历史版本,提交记录,branch,tag等信息。...命令被直接设置到一个特定的commit上,这种情况被称之为 detached HEAD ├── hooks 钩子程序,可以被用于在执行git命令时自动执行一些特定操作...b767d7这个commit中保存了一个tree对象,可以把该tree对象看成这次提交相关的所有文件的根目录。让我们来看看该tree对象中的内容。...Tag和branch类似,也是指向某个commit的指针。不同的是tag创建后其指向的commit不能变化,而branch创建后,其指针会在提交新的commit后向前移动。...被回退了,但修改的文件还存在,处于Unstaged状态,你可以对这些文件进行改动后再次提交。

    73330
    领券