分享关于Entity Framework 进行CRUD操作实验的结果
我们在使用Entity Framework框架进行CRUD时,经常会出现各种各样的错误,下面请看我的实验结果。
以下是只用一个上下文对象进行操作:
第一次:
BlogDbContext blog = new BlogDbContext();
post = blog.Posts.Single(t => t.Id == 2);
post.AuthorId = 1;
blog.SaveChanges();
结果:成功
第二次:
BlogDbContext blog = new BlogDbContext();
post = blog.Posts.Single(t => t.Id == 2);
post.Author = blog.Authors.Single(t => t.Id == 3);
blog.SaveChanges();
结果:成功
第三次:
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.
第四次:
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();
结果:成功
第五次:
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的信息,故当成新增。
以下是在两个不同的上下文中进行操作:
第六次:
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();
结果:成功
第七次:
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.
第八次:
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();
结果:失败,报错同第七次
第九次:
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();
结果:失败,报错同第七次
第十次:
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();
结果:失败,报错同第七次
第十一次:
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,则与第七次相同的报错
第十二次:
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();
结果:失败,报错同第七次
第十三次:
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条结论相同。
分享关于Entity Framework 进行CRUD操作实验的结果的更多相关文章
- 分享基于Entity Framework的Repository模式设计(附源码)
关于Repository模式,在这篇文章中有介绍,Entity Framework返回IEnumerable还是IQueryable? 这篇文章介绍的是使用Entity Framework实现的Rep ...
- [UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)
前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Enti ...
- 分享使用Entity Framework的一个坑:Include无效
如果不想延迟加载,可以通过设置:context.Configuration.LazyLoadingEnabled = false;或查询时加上AsNoTracking()方法即可. 如果不想生成代理, ...
- Entity Framework学习笔记(二)----CRUD(1)
请注明转载地址:http://www.cnblogs.com/arhat 这篇文章老魏和大家分享一下Entity Framework的CRUD操作,在这之前呢,老魏先说一下老魏对EF的一个整体的认识, ...
- Entity Framework学习笔记(三)----CRUD(2)
请注明转载地址:http://www.cnblogs.com/arhat 昨天晚上老魏配的机器终于到了,可是拿回来之后什么都组装好了,唯独差一个非常重要的组件"电源线",老魏那个汗 ...
- Entity Framework 简单增删改操作
前言 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加.删除.修改操作. 增加 在EF中添加 ...
- 第三篇 Entity Framework Plus 之 Query Cache
离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...
- 关于Entity Framework中的Attached报错的完美解决方案
我们在使用Entity Framework进行CRUD时,为了提升查询效率,一般均会启动NoTracking,即不追踪变化,设置代码如下: //这是DB First模式下设置方法: aTestEnti ...
- Entity Framework 基础
在忙碌中渡过了5,6,7 月份,现在些抽点时间对Entity Framework的使用做一些基础的回忆. Entity Framework 是什么? Entity Framework(EF)和我们所熟 ...
随机推荐
- 软件工程day4
使用ps制作了一个icon,将在下个版本中添加,用作程序图标. 参与组例会,得知新功能“吐槽墙”将以聊天室类似的社区形式实现. 提出对现有UI的建议: 对目前的登录窗口的UI不做改动,将标题的“用户登 ...
- google map javascript api v3 例子
之前一直用百度map,但如果是国外的项目就需要用google地图.由于在国内屏蔽了google地图的服务,因此调用的是一个国内地址(开发用).这个地址没有用key,语言设置也还是中文的. //---- ...
- STC12C5A60S2笔记1(管脚定义)
STC12C5A60S2管脚定义 管脚1:标准IO口P1.0.ADC0 模数转换通道0.CLKOUT2 波特率发生器的时钟输出 管脚2:标准IO口P1.1.ADC1 模数转换通道1 管脚3:标准IO口 ...
- 分享一个简单程序(webApi+castle+Automapper+Ef+angular)
前段时间在周末给朋友做了一个小程序,用来记录他们单位的一些调度信息(免费,无版权问题).把代码分享出来.整个程序没有做任何架构.但是麻雀虽小,用到的技术也没少.WebApi+Castle+AutoMa ...
- 淘宝UWP桌面版公测-谁需要邀请码?
今天taobaoUWP桌面版上线beta测试了.哪位朋友需要邀请码的,请与我联系. 前提是,您的PC已经升级到Windows 10 10586版本了,否则无法使用. 邀请码数量有限,一人一枚,共20枚 ...
- VS2012下配置MPI
并行处理结课实验,要用到MPI编程,我的电脑和VS2012都是64位的,以为MPICH也得是64位才行,结果饶了很大的弯——配置正确,添加引用之后,仍然无法识别MPI函数. 后来换了个32位的MPIC ...
- excel怎么固定第一行
这里给大家介绍一下怎么固定表格的第一行,或者说怎么固定表格的表头. 1.我这里有一个成绩表,希望固定住其第一行. 2.选择单元格A2 注意:你只需要选择所要固定行的下一行的任一单元格即可!!! 3.然 ...
- Lua字符串库(整理)
Lua字符串库小集 1. 基础字符串函数: 字符串库中有一些函数非常简单,如: 1). string.len(s) 返回字符串s的长度: 2). string.rep(s,n) 返回 ...
- Atitit图片复制父目录给你设计的实现 基于win 图片浏览器
Atitit图片复制父目录给你设计的实现 基于win 图片浏览器 打开属性,获取其路径...1 Ahk参数传递,使用环境变量即可1 如何ahk异常转换为java异常1 如何获取ahk的输出.1 C:\ ...
- Atitit 代理与分销系统(1) 子代理 充值总额功能设计概览 sum() groubpy subagt
Atitit 代理与分销系统(1) 子代理 充值总额功能设计概览 sum() groubpy subagt Keyword 分组与聚合操作. 一个for做分组...里面的做聚合... 数据g操作查 ...