首页
学习
活动
专区
工具
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
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

EF简介

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

1.4K80

求知 | 聊聊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

31710

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方法生成一段UpdateSQL语句且Where 条件 // 为对象主键Id

1.4K40

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

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

78130

一文读懂字符串String

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

49620

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

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

61150

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对应引用值,作为此次commitparent。...前文介绍过,当文件修改后进行提交,Git会创建一份快照。这样长久下去,必定会占用很大存储空间。而比较古老版本价值已经不大,所以要想办法清理出足够空间供用户使用。

36350

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

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

35810

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

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

24640

应该在项目中使用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还不稳定.

97040

画说 Ruby 与 Python 垃圾回收

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

68310

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

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

4.7K52

在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.7K100

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

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

1.3K30

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

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

65430

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

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

46110

Git内部存储原理

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

68730

ASP.NET MVC5高级编程——(3)MVC模式模型

、Create、Edit和Delete操作控制器及其需要所有相关视图,并且还生成了与数据库交互(持久保存数据到数据库或从数据库中读取数据)代码。...EF是一个对象关系映射(object-relational mapping,ORM)框架,它不但知道如何在关系型数据库中保存.NET对象,而且还可以利用LINQ查询语句检索那些保存在关系型数据库中.net...可以告知EF在应用程序每次启动重新创建数据库或者仅当检测到模型变化时重建数据库。当调用EFDatabase类中静态方法SetInitializer,可以选择这两种策略中任意一个。...(1)编辑happy path happy path就是当模型处于有效状态并可以将对象保存到数据库执行代码路径。操作通过Model.IsValid属性来检查模型对象有效性。...,所以框架应该对现有的专辑应用数据库中值而不要再创建一个专辑记录。

4.7K40
领券