分享关于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)和我们所熟 ...
随机推荐
- SQL入门经典(五) 之键和约束
这一篇博客主要讲键的创建,约束的创建.修改对象和删除对象. 主键:主键是每行的唯一标识符,必须包含唯一值(因此不能为NULL).由于主键在关系中数据库的重要性,因此它是所有键和约束中最重要的.一个表最 ...
- PC版淘宝UWP揭秘
经过第一轮内测后的bug数量:65 2015/11/27 - bug数量 = 60 2015/11/30 - bug数量 = 53 2015/12/1 - bug数量 = 49 2015/12/2 - ...
- 【读书笔记】Html5游戏开发
一直对HMTL5做游戏饶有兴趣,而这本书刚好就是HTML5 2游戏初级入门的书.Demo简单注释详细,可以拿来练练手,一个星期左右就可以读完.若要追求酷炫高大上效果,这本书恐怕要让你失望了.但作为上手 ...
- 【面试必备】javascript的原型和继承
原型.闭包.作用域等知识可以说是js中面试必考的东西,通过你理解的深度也就能衡量出你基本功是否扎实.今天来复习一下javascript的原型和继承,虽说是老生常谈的话题,但对于这些知识,自己亲手写一遍 ...
- 根据Excel的内容和word模板生成对应的word文档
Sub setname() Dim I As Integer Dim pspname As String Dim pspnumber As String Dim path As String Dim ...
- SQLServer 随机生成指定范围的日期
一个分页的问题,DTCms3.0中,分页是根据时间分页的,如果当添加时间(add_time)都是同一个数值时,不管点击第几页,显示的数据都是同一个的内容,于是就有了需要把同一个时间改指定随机日期的功能 ...
- jQuery.width()和jQuery.css('width')的区别
[TOC] 问题描述 使用jQuery修改一个div的宽度时,发现$($0).width('10rem')总是修改成不正确的值,然后使用$($0).css('width', '10rem')时却能正确 ...
- 浅析SQL Server实现分布式事务的两阶段提交协议2PC
不久之前团队有个新人问我一个很重要的web服务接口如何保证事务的问题.因为涉及到跨库事务,当时我只是回答目前我们的SOA框架都不支持跨库事务.然后就问到了数据库跨库事务是如何实现的,我只能凭印象含糊回 ...
- git 修改管理
查看修改: 撤销某一文件的修改(还没提交): 撤销所有文件的修改: git checkout .
- Redis中5种数据结构的使用场景介绍
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/108.html?1455861435 一.redis 数据结构使用场景 原 ...