当前位置: 首页 > news >正文

分享关于Entity Framework 进行CRUD操作实验的结果

我们在使用Entity Framework框架进行CRUD时,经常会出现各种各样的错误,下面请看我的实验结果。

以下是只用一个上下文对象进行操作:

第一次:

1
2
3
4
BlogDbContext blog =  new  BlogDbContext();
post = blog.Posts.Single(t => t.Id == 2);
post.AuthorId = 1;
blog.SaveChanges();

结果:成功

第二次:

1
2
3
4
BlogDbContext blog =  new  BlogDbContext();
post = blog.Posts.Single(t => t.Id == 2);
post.Author = blog.Authors.Single(t => t.Id == 3);
blog.SaveChanges();

结果:成功

第三次:

1
2
3
4
5
BlogDbContext blog =  new  BlogDbContext();
post = blog.Posts.Single(t => t.Id == 2);
post.AuthorId = 1;
post.Author = blog.Authors.Single(t => t.Id == 4);
blog.SaveChanges();

结果:失败,报错如下:

Conflicting changes to the role 'Post_Author_Target' of the relationship 'ConsoleApplication1.DDD.Infrastructure.Post_Author' have been detected.

第四次:

1
2
3
4
5
BlogDbContext blog =  new  BlogDbContext();
post = blog.Posts.Single(t => t.Id == 2);
post.Author =  new  Author() { Id = 4 };
blog.Entry(post.Author).State = EntityState.Unchanged;
blog.SaveChanges();

结果:成功

第五次:

1
2
3
4
5
6
BlogDbContext blog =  new  BlogDbContext();
post = blog.Posts.Single(t => t.Id == 2);
//author = new Author() { Id = 1, Name = "zwj" };//直接实例化或下面查询得出
author = blog.Authors.AsNoTracking().Single(t => t.Id == 3);
post.Author = author;
blog.SaveChanges();

结果:成功,但是Authors表中会新增一笔记录,并将新的ID赋值给Posts表;原因:Author与Post不在同一个上下文中,Post所在的上下文中追踪不到Author的信息,故当成新增。

以下是在两个不同的上下文中进行操作:

第六次:

1
2
3
4
5
6
7
8
BlogDbContext blog =  new  BlogDbContext();
post = blog.Posts.AsNoTracking().Single(t => t.Id == 2);
//blog.Entry(post).State = EntityState.Detached;上面的AsNoTracking可以由这句实现
 
BlogDbContext blog2 =  new  BlogDbContext();
post.AuthorId = 5;
blog2.Entry(post).State = EntityState.Modified;
blog2.SaveChanges();

结果:成功

第七次:

1
2
3
4
5
6
7
BlogDbContext blog =  new  BlogDbContext();
post = blog.Posts.AsNoTracking().Single(t => t.Id == 2);
 
BlogDbContext blog2 =  new  BlogDbContext();
post.Author = blog2.Authors.Single(t => t.Id == 5);
blog2.Entry(post).State = EntityState.Modified;
blog2.SaveChanges();

结果:失败,报错如下:

A referential integrity constraint violation occurred: The property value(s) of 'Author.Id' on one end of a relationship do not match the property value(s) of 'Post.AuthorId' on the other end.

第八次:

1
2
3
4
5
6
7
8
BlogDbContext blog =  new  BlogDbContext();
post = blog.Posts.AsNoTracking().Single(t => t.Id == 2);
 
BlogDbContext blog2 =  new  BlogDbContext();
author = blog2.Authors.AsNoTracking().Single(t => t.Id == 1);
post.Author = author;
blog2.Entry(post).State = EntityState.Modified;
blog2.SaveChanges();

结果:失败,报错同第七次

第九次:

1
2
3
4
5
6
7
8
BlogDbContext blog =  new  BlogDbContext();
post = blog.Posts.AsNoTracking().Single(t => t.Id == 2);
author = blog.Authors.AsNoTracking().Single(t => t.Id == 3);
 
BlogDbContext blog2 =  new  BlogDbContext();
post.Author = author;
blog2.Entry(post).State = EntityState.Modified;
blog2.SaveChanges();

结果:失败,报错同第七次

第十次:

1
2
3
4
5
6
7
8
BlogDbContext blog =  new  BlogDbContext();
post = blog.Posts.AsNoTracking().Single(t => t.Id == 2);
 
BlogDbContext blog2 =  new  BlogDbContext();
author =  new  Author() { Id = 1, Name =  "zwj"  };
post.Author = author;
blog2.Entry(post).State = EntityState.Modified;
blog2.SaveChanges();

结果:失败,报错同第七次

第十一次:

1
2
3
4
5
6
7
8
9
BlogDbContext blog =  new  BlogDbContext();
post = blog.Posts.AsNoTracking().Single(t => t.Id == 2);
 
BlogDbContext blog2 =  new  BlogDbContext();
author = blog2.Authors.Single(t => t.Id == 1);
post.Author = author;
post.AuthorId = author.Id;
blog2.Entry(post).State = EntityState.Modified;
blog2.SaveChanges();

结果:成功,但我认为主要是通过赋值AuthorId来完成的,与第六次相同,去掉赋值AuthorId,则与第七次相同的报错

第十二次:

1
2
3
4
5
6
7
8
BlogDbContext blog =  new  BlogDbContext();
post = blog.Posts.AsNoTracking().Single(t => t.Id == 2);
 
BlogDbContext blog2 =  new  BlogDbContext();
author = blog2.Authors.Single(t => t.Id == 3);
blog2.Entry(post).Reference(t => t.Author).CurrentValue = author;
blog2.Entry(post).State = EntityState.Modified;
blog2.SaveChanges();

结果:失败,报错同第七次

第十三次:

1
2
3
4
5
6
7
BlogDbContext blog =  new  BlogDbContext();
post = blog.Posts.AsNoTracking().Single(t => t.Id == 2);
 
BlogDbContext blog2 =  new  BlogDbContext();
blog2.Posts.Attach(post);
post.Author = blog2.Authors.Single(t => t.Id == 1);
blog2.SaveChanges();

结果:成功

 

最后得出结论:

1.在同一个上下文中,不论是采用直接赋值导航属性或是直接赋值外键属性,除不能同时对导航属性及外键属性赋不相关联的值外,都可以成功;

2.不在同一个上下文中,若想在完成CUD时,则必需先确保要进行操作的实体处于Detached状态,然后再进行相应的更新,涉及导航属性时,只能采用赋值外键属性,不能通过导航属性直接赋值,否则会报错(这个我觉得是个BUG,不知大家有什么好的解决办法没有),若采用先在新的上下文中Attached,再进行更新操作则与第1条结论相同。

本文转自 梦在旅途 博客园博客,原文链接:http://www.cnblogs.com/zuowj/p/4864390.html  ,如需转载请自行联系原作者

相关文章:

  • 文件地理数据库的大小和名称限制
  • OID
  • Hyper-V Server 2012 R2介绍
  • 单例模式--SingleTon
  • BZOJ-1853: [Scoi2010]幸运数字 (容斥原理)
  • ORA-01950: no privileges on tablespace
  • 计算机硬件组成
  • C[a,b]向量空间中的函数的线性相关性
  • UDP中转服务器
  • 综合应用WPF/WCF/WF/LINQ之七:数据库开发人员的Solution
  • 关于免费空间的寻找
  • centos访问windowsxp共享资源指南.
  • 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 系列目录
  • RAID知识笔记1
  • Exchange Server2010系列之四:初谈邮箱基本管理
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java 网络编程(2):UDP 的使用
  • Laravel 菜鸟晋级之路
  • php中curl和soap方式请求服务超时问题
  • Promise面试题,控制异步流程
  • Rancher如何对接Ceph-RBD块存储
  • React中的“虫洞”——Context
  • spring + angular 实现导出excel
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue--为什么data属性必须是一个函数
  • zookeeper系列(七)实战分布式命名服务
  • 从setTimeout-setInterval看JS线程
  • 服务器从安装到部署全过程(二)
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • raise 与 raise ... from 的区别
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $L^p$ 调和函数恒为零
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (HAL库版)freeRTOS移植STMF103
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (十一)c52学习之旅-动态数码管
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (推荐)叮当——中文语音对话机器人
  • (一)Dubbo快速入门、介绍、使用
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (一)基于IDEA的JAVA基础1
  • (转) Face-Resources
  • (转载)Google Chrome调试JS
  • ******IT公司面试题汇总+优秀技术博客汇总
  • **PHP分步表单提交思路(分页表单提交)
  • .net Stream篇(六)
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉