EntityFramework 基础的crud

时间:2022-10-27 15:40:29

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的更多相关文章

  1. EntityFramework基础

    好久没有学习新东西了,最近研究了下EntityFramework,将基础代码贴出来, Entity Framework 利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (entity ...

  2. EntityFramework 基础提供程序在 Open 上失败

    最近项目开始上线,所以抽时间学习了一下EF.虽然项目中一直在用,但是因为一些原因,一直是知其然不知其所以然,紧紧只限于会用而已.这两天自己搭建了一个MVC的EF框架,虽然也有参考网上各种资料,但是依然 ...

  3. &lbrack;转&rsqb;EntityFramework走马观花之CRUD(下)

    学习Entity Framework技术期间查阅的优秀文章,出于以后方便查阅的缘故,转载至Blog,可查阅原文:http://blog.csdn.net/bitfan/article/details/ ...

  4. &lbrack;转&rsqb;EntityFramework走马观花之CRUD(中)

    学习Entity Framework技术期间查阅的优秀文章,出于以后方便查阅的缘故,转载至Blog,可查阅原文:http://blog.csdn.net/bitfan/article/details/ ...

  5. &lbrack;转&rsqb;EntityFramework走马观花之CRUD(上)

    学习Entity Framework技术期间查阅的优秀文章,出于以后方便查阅的缘故,转载至Blog,可查阅原文:http://blog.csdn.net/bitfan/article/details/ ...

  6. EntityFramework走马观花之CRUD(上)

    对于任何一个ORM框架,CRUD都是其核心功能,可以这么说,CRUD功能实现得好坏,直接决定了此ORM框架的命运. CRUD是英文Create.Read.Update.Delete四个单词的缩写,对应 ...

  7. EntityFramework 基础提供程序在 Open 上失败。

    问题 System.Data.EntityException: 基础提供程序在 Open 上失败. ---> System.Data.SqlClient.SqlException: 在与 SQL ...

  8. 初始WebApi 利用WebApi实现基础的CRUD

    微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService.它是简单,代码 ...

  9. EntityFramework走马观花之CRUD(下)

    我在Entity Framework系列文章的CRUD上篇中介绍了EF的数据查询,中篇谈到了EF的数据更新,下篇则聊聊EF实现CRUD的内部原理. 跟踪实体对象状态 在CRUD上篇和中篇谈到,为了实现 ...

随机推荐

  1. dom添加事件

    1.语法:document.getElementById('btn').addEventListener 2.可以添加多个EventListener,且不会覆盖 3.移除EventListener, ...

  2. 慕课网-安卓工程师初养成-1-5 使用Eclipse开发Java程序

    来源: http://www.imooc.com/video/1412 eclipse --- IDE 集成开发环境(IDE)是一类软件 将程序开发环境和程序调试环境集合在一起,提高开发效率 其他ID ...

  3. 在一般处理程序中,把Form Post过来的表单集合转换成对象 ,仿 MVC post&comma;反射原理

    using System; using System.Collections.Generic; using System.Collections.Specialized; using System.L ...

  4. Python 中使用optparse进行参数解析

    使用过Linux/Unix的人都会知道,命令行下的很多命令都需要参数,在C语言中添加和解析参数比较繁琐.Python中提供了optparse模块可以非常方便地处理命令行参数.   1  命令行参数的样 ...

  5. 201521123035《Java程序设计》第六周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  6. PHP 第3方评论系统

    这段时间,无觅 评论也下线不能使用了. 客户好几个网站使用了.无觅 评论,前面也是用的是多说还是什么,总之也是第3方评论,没想到没过多久,又停止使用了. 没办法,网站还是需要评论系统,一气之下,自己做 ...

  7. python模块------shutil

    说明 shutil -- High-level file operations 是一种高层次的文件操作工具 类似于高级API,而且主要强大之处在于其对文件的复制与删除操作更是比较支持好. copy() ...

  8. linux根目录介绍

    1. /bin binary二进制 存放系统许多可执行程序文件 执行的相关指令,例如ls pwd whoami,后台的支持文件目录 2. /sbin super binary超级的二进制 存放系统许多 ...

  9. android------eclipse运行错误提示 Failed to load D&colon;&bsol;Android&bsol;sdk&bsol;build-tools&bsol;26&period;0&period;0-preview&bsol;lib&bsol;dx&period;jar

    更新了SDK后,在ecplise上运行项目时出现了一个问题. 一运行就提示这个错误:Your project contains error(s), please fix them before run ...

  10. pgadmin导出excel

    生成导入sql 第一行公式:="insert into province(code,name) values("&A2&",'"&B2& ...