我们在使用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. 软件工程day4

    使用ps制作了一个icon,将在下个版本中添加,用作程序图标. 参与组例会,得知新功能“吐槽墙”将以聊天室类似的社区形式实现. 提出对现有UI的建议: 对目前的登录窗口的UI不做改动,将标题的“用户登 ...

  2. google map javascript api v3 例子

    之前一直用百度map,但如果是国外的项目就需要用google地图.由于在国内屏蔽了google地图的服务,因此调用的是一个国内地址(开发用).这个地址没有用key,语言设置也还是中文的. //---- ...

  3. STC12C5A60S2笔记1(管脚定义)

    STC12C5A60S2管脚定义 管脚1:标准IO口P1.0.ADC0 模数转换通道0.CLKOUT2 波特率发生器的时钟输出 管脚2:标准IO口P1.1.ADC1 模数转换通道1 管脚3:标准IO口 ...

  4. 分享一个简单程序(webApi+castle+Automapper+Ef+angular)

    前段时间在周末给朋友做了一个小程序,用来记录他们单位的一些调度信息(免费,无版权问题).把代码分享出来.整个程序没有做任何架构.但是麻雀虽小,用到的技术也没少.WebApi+Castle+AutoMa ...

  5. 淘宝UWP桌面版公测-谁需要邀请码?

    今天taobaoUWP桌面版上线beta测试了.哪位朋友需要邀请码的,请与我联系. 前提是,您的PC已经升级到Windows 10 10586版本了,否则无法使用. 邀请码数量有限,一人一枚,共20枚 ...

  6. VS2012下配置MPI

    并行处理结课实验,要用到MPI编程,我的电脑和VS2012都是64位的,以为MPICH也得是64位才行,结果饶了很大的弯——配置正确,添加引用之后,仍然无法识别MPI函数. 后来换了个32位的MPIC ...

  7. excel怎么固定第一行

    这里给大家介绍一下怎么固定表格的第一行,或者说怎么固定表格的表头. 1.我这里有一个成绩表,希望固定住其第一行. 2.选择单元格A2 注意:你只需要选择所要固定行的下一行的任一单元格即可!!! 3.然 ...

  8. Lua字符串库(整理)

    Lua字符串库小集 1. 基础字符串函数:    字符串库中有一些函数非常简单,如:    1). string.len(s) 返回字符串s的长度:    2). string.rep(s,n) 返回 ...

  9. Atitit图片复制父目录给你设计的实现 基于win 图片浏览器

    Atitit图片复制父目录给你设计的实现 基于win 图片浏览器 打开属性,获取其路径...1 Ahk参数传递,使用环境变量即可1 如何ahk异常转换为java异常1 如何获取ahk的输出.1 C:\ ...

  10. Atitit  代理与分销系统(1)  子代理 充值总额功能设计概览 sum() groubpy subagt

    Atitit  代理与分销系统(1)  子代理 充值总额功能设计概览 sum() groubpy subagt Keyword 分组与聚合操作. 一个for做分组...里面的做聚合... 数据g操作查 ...