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上篇和中篇谈到,为了实现 ...
随机推荐
- Install Google Pinyin on Ubuntu 14.04
Install Google Pinyin on Ubuntu 14.04 I've been spending more and more time on Ubuntu and I'm not us ...
- 【OOAD】OOAD概述
什么是面向对象? OOP:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构.OOP 的一条基本原则是计算机程序是由单个能够起到子程序 ...
- iOS9 collectionView新特性
近日因为系统升级导致xcode6.系列版本出现bug,于是开始使用xcode7.在使用之余突然想到collectionView在iOS9中发布了一个可以移动cell的新特性,就尝试着将其实现,无奈ap ...
- datatables设置解析
条信息" "sSearch":"搜索" 基本的命令 aaSorting:参数是个数组 [[],[]]单独定义每一列的排序方式 aaSortingFi ...
- git: windows git ssh keys生成
http://blog.csdn.net/lsyz0021/article/details/52064829 当我们使用github或者bitbucket等仓库时我们有可能需要ssh认证,所以需要生成 ...
- vue.js学习笔记之v-bind,v-on
v-bind 指令用于响应地更新 HTML 特性 形式如:v-bind:href 缩写为 :href; v-on 指令用于监听DOM事件 形式如:v-on:click 缩写为 @clic ...
- (33)odoo中产品价格字段
打开product.template 和 product.product 模型发现有很多关于价格描述的字段 product.template: price list_pri ...
- JavaScipt 源码解析 css选择器
css1-css3提供了很多选择器,总得来说分为几大类: 群组选择器:逗号"," 简单选择器:ID,标签,类,属性,通配符 关系选择器:孩子,后代,兄弟,相邻 伪类选择器:动作伪类 ...
- javascript 技巧
1.将arguments转化为数组函数中的预定义变量arguments并非一个真正的数组,而是一个类似数组的对象. 它具有length属性,但是没有slice, push, sort等函数,那么如何使 ...
- easyui-textbox 和 easyui-validatebox 设置值和获取值
表单作如下定义:该input使用easyui的"easyui-textbox" <input id="addSnumber" style="wi ...