EntityFramework 基础的crud
EntityFramework 基础的crud操作
根据上一张实体映射的demo学习基础的crud操作
1、增加
BlogDbContext dbContext = new BlogDbContext();
var post = new Post()
{
PostTitle = "测试添加",
BlogUserId = ,
CreateTime = DateTime.Now
};
var ce = dbContext.Set<Post>();
ce.Add(post);
dbContext.SaveChanges();
2、删除
方法一:
var dbcontext = new BlogDbContext();
var posts = dbcontext.Set<Post>();
Post postModel = posts.Find();
if (postModel != null)
{
posts.Remove(postModel);
dbcontext.SaveChanges();
}
方法二:
var dbcontext = new BlogDbContext();
var posts = dbcontext.Set<Post>();
Post postModel = posts.Find();
dbcontext.Entry(postModel).State = EntityState.Deleted;
dbcontext.SaveChanges();
3、修改
var dbcontext = new BlogDbContext();
var posts = dbcontext.Set<Post>();
Post postModel = posts.Find();
if (postModel != null)
{
postModel.PostTitle = "测试修改";
dbcontext.Entry(postModel).State = System.Data.EntityState.Modified;
dbcontext.SaveChanges();
}
上面方法中每次都需要对所有字段进行修改,效率低,而且麻烦,下面介绍修改部分字段
var Post = new Post
{
PostId = ,
PostTitle = "更新",
BlogUserId =
};
//将实体附加到对象管理器中
dbcontext.Set<Post>().Attach(Post);
//获取到Post的状态实体,可以修改其状态
var setEntry = ((IObjectContextAdapter)dbcontext).ObjectContext.ObjectStateManager.GetObjectStateEntry(Post);
//只修改实体的PostTitle属性
setEntry.SetModifiedProperty("PostTitle");
//setEntry.SetModifiedProperty("BlogUserId"); dbcontext.SaveChanges();
4、查询
var dbContext = new BlogDbContext();
IQueryable<Post> Posts = dbContext.Set<Post>();
Posts.ToList();
var result = from i in dbContext.Set<Post>() //使用LINQ查询发帖人id为2的帖子
where i.BlogUserId ==
select i;
如果查询部门字段可以用如下方法:
var dbContext = new BlogDbContext();
IQueryable<Post> Posts = dbContext.Set<Post>();
var data = Posts.Select(c => new { c.PostTitle, c.BlogUserId }).ToList();
以上是使用EF对数据库实现CRDU,但是在有些时候必须要用sql语句
在数据上下文dbContext的实例中有个Database属性,其中有两组方法.ExecuteSqlCommand()和.SqlQuery()。它们都可以执行SQL语句,只不过.ExecuteSqlCommand()是不返回结果的,只返回受影响的行数,所以.ExecuteSqlCommand()更适合执行创建、更新、删除操作。.SqlQuery()则会返回查询到的结果,并将结果保存在数据实体中,所以更适合执行查询操作
使用.ExecuteSqlCommand()实现创建、更新、删除
1、sql语句添加数据
BlogDbContext dbContext = new BlogDbContext();
string sql = @"insert into [Posts] ([PostTitle],[BlogUserId],[CreateTime])
values (@PostTitle,@BlogUserId,@CreateTime)";
var args = new DbParameter[] {
new SqlParameter { ParameterName = "PostTitle", Value = "EntityFramework"},
new SqlParameter { ParameterName = "BlogUserId", Value=2},
new SqlParameter { ParameterName = "CreateTime", Value=DateTime.Now}
};
int rowCount = dbContext.Database.ExecuteSqlCommand(sql, args);
2、修改
var dbcontext = new BlogDbContext();
var result = dbcontext.Database.ExecuteSqlCommand(@"UPDATE [Posts] SET [PostTitle] ='EntityFramework基础的Crud' WHERE PostId = 3;");
3、删除
var dbcontext = new BlogDbContext();
int result = dbcontext.Database.ExecuteSqlCommand(" delete from Posts where PostId=6 ");
使用.SqlQuery()查询数据
从名字就看的出来.SqlQuery()是用来执行查询的。.SqlQuery()使用前需指定返回值的数据类型,比如查询一条帖子的完整信息,类型就可以指定为Post类型。如果是统计有多少条,返回值是个整数,就以设置为int。
注意:不仅返回值的个数必须与传入类型中属性值的个数相同,而且名称还必须一样,不然会出错。那么如果我只想获取标题和id,那就得单独定义一个类(其中包含一个string类型的PostTitle和int类型的PostId),来保存数据了。
string sqlString = "SELECT [PostId],[PostTitle],[BlogUserId],[CreateTime] FROM [Posts] ";
BlogDbContext dbContext = new BlogDbContext();
var data = dbContext.Database.SqlQuery<PostDto>(sqlString).ToList();
使用DbSet<T>下的.SqlQuery()
在每个数据实体集合DbSet<T>下也有一个.SqlQuery(),功能与上面介绍的一样,只不过DbSet<T>下的.SqlQuery()只能返回DbSet<T>中包含的类型。但DbSet<T>下的.SqlQuery()在返回数据的同时还会让数据库上下文(DBModel)跟踪返回数据的状态,如果返回的数据发生了修改,就可以使用.SaveChanges()将结果直接保存回数据库。而.Database.SqlQuery()查出的结果则是做不到的。
string sqlString = "SELECT [PostId],[PostTitle],[BlogUserId],[CreateTime] FROM [Posts] ";
BlogDbContext dbContext = new BlogDbContext();
var data = dbContext.Set<Post>().SqlQuery(sqlString).ToList();
EF使用事务
使用TransactionScope类
使用之前引入System.Transactions.dll
BlogDbContext dbContext = new BlogDbContext();
using (var tran = new TransactionScope()) //开启事务
{
var post = dbContext.Set<Post>().FirstOrDefault(s => s.PostTitle == "EntityFramework");
dbContext.Set<Post>().Remove(post); //删除
dbContext.SaveChanges();
tran.Complete(); //必须调用.Complete(),不然数据不会保存
} //出了using代码块如果还没调用Complete(),所有操作就会自动回滚
EntityFramework 基础的crud的更多相关文章
- EntityFramework基础
好久没有学习新东西了,最近研究了下EntityFramework,将基础代码贴出来, Entity Framework 利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (entity ...
- EntityFramework 基础提供程序在 Open 上失败
最近项目开始上线,所以抽时间学习了一下EF.虽然项目中一直在用,但是因为一些原因,一直是知其然不知其所以然,紧紧只限于会用而已.这两天自己搭建了一个MVC的EF框架,虽然也有参考网上各种资料,但是依然 ...
- [转]EntityFramework走马观花之CRUD(下)
学习Entity Framework技术期间查阅的优秀文章,出于以后方便查阅的缘故,转载至Blog,可查阅原文:http://blog.csdn.net/bitfan/article/details/ ...
- [转]EntityFramework走马观花之CRUD(中)
学习Entity Framework技术期间查阅的优秀文章,出于以后方便查阅的缘故,转载至Blog,可查阅原文:http://blog.csdn.net/bitfan/article/details/ ...
- [转]EntityFramework走马观花之CRUD(上)
学习Entity Framework技术期间查阅的优秀文章,出于以后方便查阅的缘故,转载至Blog,可查阅原文:http://blog.csdn.net/bitfan/article/details/ ...
- EntityFramework走马观花之CRUD(上)
对于任何一个ORM框架,CRUD都是其核心功能,可以这么说,CRUD功能实现得好坏,直接决定了此ORM框架的命运. CRUD是英文Create.Read.Update.Delete四个单词的缩写,对应 ...
- EntityFramework 基础提供程序在 Open 上失败。
问题 System.Data.EntityException: 基础提供程序在 Open 上失败. ---> System.Data.SqlClient.SqlException: 在与 SQL ...
- 初始WebApi 利用WebApi实现基础的CRUD
微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService.它是简单,代码 ...
- EntityFramework走马观花之CRUD(下)
我在Entity Framework系列文章的CRUD上篇中介绍了EF的数据查询,中篇谈到了EF的数据更新,下篇则聊聊EF实现CRUD的内部原理. 跟踪实体对象状态 在CRUD上篇和中篇谈到,为了实现 ...
随机推荐
- Gradle build设置自动log开关
应用场景 通常情况下我们的apps发布后也就是release模式下log是不显示的,debug模式下是显示log的,但是在特殊情况下我们测试release包的时候需要log的时候,就无法使用Build ...
- HTML基础(2)
常见标签 1.img标签 <img src="图片地址" alt="图片名"/> 图片(单标签) alt属性 是图片名字,是给百度搜索引擎抓取使用 ...
- jQuery核心之 $
参考jQuery官网API文档 $ 和 $() 的区别很重要: 1.$(document).ready() 和 $(document).load() 的 区别: 前者等到DOM准备好了之后就会 ...
- 使用Github管理项目代码的版本
作为开源代码库以及版本控制系统,Github拥有140多万开发者用户.随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法. 在Git中并不存在主库这样的概 ...
- hdu4758Walk Through Squares(ac自动机+dp)
链接 dp[x][y][node][sta] 表示走到在x,y位置node节点时状态为sta的方法数,因为只有2个病毒串,这时候的状态只有4种,根据可走的方向转移一下. 这题输入的是m.N,先列后行, ...
- Nine-Patch图片
Nine-Patch图片以.9.png结尾,用作背景图片时,可使背景随着内容拉伸(缩小)而拉伸(缩小). 如何将普通图片制作为Nine-Patch图片: 在Android sdk目录下有一个tools ...
- HTML5 十大新特性(一)——语义标签
说语义标签前先来理解下什么叫语义化,当下html是靠div+css来铸造页面的整体框架和结构的,通篇大量的div可读性极低,因此诞生了这些特殊的标签,简单地说就是见名知义,使页面更清晰,方便维护和开发 ...
- java 多线程—— 线程等待与唤醒
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Objective-C( Foundation框架 一 数组(NSArray))
OC数组 NSArray是静态的数组,就是它所指向的内容是不可改变的,它指向一段内存区域,一旦初始化,不能通过它对该内存区域的数据进行修改操作,但是它可以读数据. NSMutableArray是动态的 ...
- Objective-C( 语法二)
分类(Category):可以给某一个类扩充一些方法(不修改原来类的代码) 作用:在不改变原来类内容基础上,可以为类增加一些方法 使用注意: 1. 只能增加方法,不能增加成员变量 2. 分类方法 ...