我们在使用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操作实验的结果的更多相关文章

  1. 分享基于Entity Framework的Repository模式设计(附源码)

    关于Repository模式,在这篇文章中有介绍,Entity Framework返回IEnumerable还是IQueryable? 这篇文章介绍的是使用Entity Framework实现的Rep ...

  2. [UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)

    前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Enti ...

  3. 分享使用Entity Framework的一个坑:Include无效

    如果不想延迟加载,可以通过设置:context.Configuration.LazyLoadingEnabled = false;或查询时加上AsNoTracking()方法即可. 如果不想生成代理, ...

  4. Entity Framework学习笔记(二)----CRUD(1)

    请注明转载地址:http://www.cnblogs.com/arhat 这篇文章老魏和大家分享一下Entity Framework的CRUD操作,在这之前呢,老魏先说一下老魏对EF的一个整体的认识, ...

  5. Entity Framework学习笔记(三)----CRUD(2)

    请注明转载地址:http://www.cnblogs.com/arhat 昨天晚上老魏配的机器终于到了,可是拿回来之后什么都组装好了,唯独差一个非常重要的组件"电源线",老魏那个汗 ...

  6. Entity Framework 简单增删改操作

    前言 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加.删除.修改操作. 增加 在EF中添加 ...

  7. 第三篇 Entity Framework Plus 之 Query Cache

    离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...

  8. 关于Entity Framework中的Attached报错的完美解决方案

    我们在使用Entity Framework进行CRUD时,为了提升查询效率,一般均会启动NoTracking,即不追踪变化,设置代码如下: //这是DB First模式下设置方法: aTestEnti ...

  9. Entity Framework 基础

    在忙碌中渡过了5,6,7 月份,现在些抽点时间对Entity Framework的使用做一些基础的回忆. Entity Framework 是什么? Entity Framework(EF)和我们所熟 ...

随机推荐

  1. 视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    说好的给园子里的朋友们录制与<ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库> 这篇博客相对应的视频,由于一个月一来没有时 ...

  2. vc编译 curl 7.36.0

    CURL邮件列表中提到官方最新版本的windows devel包中缺少文件,而我又用不到https,所以我就自己下载源码包来编译了 下载源码包:http://curl.haxx.se/download ...

  3. JDBC学习1:详解JDBC使用

    什么是JDBC JDBC(Java Database Connectivity),即Java数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系数据库提供同一访问,它由一组用Java ...

  4. 作业七:团队项目——Alpha版本冲刺阶段-10

    部分代码: public void run(){ while (true){ //单击棋子第一下开始闪烁 if (chessManClick){ play[Man].setVisible(false) ...

  5. js DOM优化相关探索

    我在这尝试两个方面:-->DOM与js -->DOM与浏览器 (最近在秒味视频上学到不少,哈哈哈) 一.DOM与js 1.js与dom的交互问题 频繁的与dom交互,是一件浪费时间与金钱的 ...

  6. as3 同屏1000+动画,不掉帧。解决方案。

    原理就是在一个enterframe里面,把1000个对象画到一个bitmapdata,然后交给舞台显示.

  7. redis中使用redis-dump导出、导入、还原数据实例

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/109.html?1455861283 redis的备份和还原,借助了第三方 ...

  8. atitit 短信接口规范与短信解决方案.docx

    atitit 短信接口规范与短信解决方案.docx 1.1. 国内比较著名的短信提供商1 1.2. 短信接口规范1 1.3. 短信sdk构成1 1.4. 短信的实现1 1.5. SmsServiceY ...

  9. VS2012 easyui datagrid url访问之坑

    VS2012 easyui datagrid url访问之坑 url属性放的是地址的话 返回的json格式必须有 total 和 rows,如下: {"total":2," ...

  10. nginx 配置管理 - 简单也复杂

    由于涉及到h5与后端交互,跨域问题,所以公司的开放测试服务器让我们自己搞nginx.顺便提升一下nginx的实践. nginx的安装,没什么难度了,百度一堆,如果源码安装就一步步来吧.(最简单的方式: ...