分享关于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  ,如需转载请自行联系原作者

相关文章
|
4月前
|
SQL 存储 Go
SQL Server 创建与管理数据库实验报告
SQL Server 创建与管理数据库实验报告
64 1
|
4月前
|
关系型数据库 MySQL Java
西电数据库实验一:数据库远程连接的实验报告
姓名:贾瑞 学号:21009201172 实验一:数据库远程连接
|
6月前
|
存储 SQL Go
数据库:存储过程实验
一、实验目的及要求 目的 掌握存储过程的编写与调用 要求 掌握存储过程的编写;掌握存储过程的调用
38 0
|
5月前
|
SQL Oracle 关系型数据库
分布式数据库系统实验四
分布式数据库系统实验四
62 0
|
2月前
|
关系型数据库 分布式数据库 数据库
云原生数据库PolarDB快速入门实验
【2月更文挑战第2天】很基础的PolarDB入门操作实验考试,假期闲着无聊考着玩玩。云原生数据库 PolarDB MySQL 版是阿里云自研产品,100%兼容 MySQL。PolarDB产品具有多主多写、多活容灾、HTAP 等特性,交易性能最高可达开源数据库的6倍,分析性能最高可达开源数据库的400倍,TCO 低于自建数据库50%。
|
4月前
|
存储 SQL 弹性计算
|
4月前
|
SQL 关系型数据库 分布式数据库
西电数据库实验二:XDSQL与PolarDB对比实验
实验二 XDSQL与PolarDB对比实验 姓名:贾瑞  学号:21009201172
|
9月前
|
SQL 存储 数据库
SQL数据恢复总结 - sql server 2012数据库基础-数据恢复-实验报告
SQL数据恢复总结 - sql server 2012数据库基础-数据恢复-实验报告
156 0
|
9月前
|
开发框架 前端开发 JavaScript
JavaWeb上机实验3 数据库访问(三)
JavaWeb上机实验3 数据库访问(三)
67 0
|
4月前
|
数据库
实验四--数据库的安全性、完整性控制
实验四--数据库的安全性、完整性控制
26 0