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上篇和中篇谈到,为了实现 ...
随机推荐
- 提取data.frame中的部分数据(不含列标题和行标题)
?unlist Given a list structure x, unlist simplifies it to produce a vector which contains all th ...
- hdu 5446 Unknown Treasure 卢卡斯+中国剩余定理
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- [Mysql] mysql临时表corrupt
问题描述 机房临时硬件问题, 机器掉电. 恢复后, 重启mysql进程, 结果出现core dump. 而且一直循环, 无法终止, 只能kill掉. backtrace如下. # service my ...
- PHP文本框的值随下拉框改变
初学PHP,下面是实现文本框内容随下拉框变化的代码实现: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- Django1.9开发博客(9)- 用户认证
你应该注意到了一点,当你去新建.修改和删除文章的时候并不需要登录,这样的话任何浏览网站的用户都能随时修改和删除我的文章.这个可不是我想要的! 编辑和删除的认证 我们需要保护post_new, post ...
- matlab实现感知机算法--统计学习小灶
clear all; clc; %% %算法 %输入:训练数据集T = {(x1,y1),(x2,y2),...,(xn,yn)};学习率η %输出:w,b;感知机模型f(x) = sign(w*x+ ...
- hive踩过的小坑
上周使用hive做一些操作,几个小问题纠结很久.特此记录下: hive概念 hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以 ...
- mysql 配置 utf8 依然乱码
mysql 乱码问题排除方案: 1.检查数据库及数据表是不是utf8字符集 2.查看一下jdbc.properties配置的数据库url 是否配置了characterEncoding=UTF-8或者在 ...
- 关于makefile
0 Makefile概述 -------------------------------------------------------------------------------- 什么是mak ...
- guava学习--Supplier Suppliers
转载:http://www.cnblogs.com/jun-ma/p/4850591.html Guava Suppliers的主要功能是创建包裹的单例对象,通过get方法可以获取对象的值.每次获取的 ...