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. [转]EntityFramework走马观花之CRUD(下)

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

  4. [转]EntityFramework走马观花之CRUD(中)

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

  5. [转]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. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序创建更复杂的数据模型

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第六篇:为ASP.NET MVC应用程序 ...

  2. linux 修改home目录下的中文目录名为英文

    编辑home/下的 .config/user-dirs.dirs,把所有的中文名称修改为英文名称 在home目录下创建对应的英文名称路径 运行 xdg-user-dirs-update 重启机器

  3. DAL、DAO、ORM、Active Record辨析

    转自:http://blog.csdn.net/suiye/article/details/7824943 模型 Model 模型是MVC中的概念,指的是读取数据和改变数据的操作(业务逻辑).一开始我 ...

  4. 与Status Bar和Navigation Bar相关的一些东西

    Android Navigation Bar Status Bar   与StatusBar和NavigationBar相关的东西有两种,一是控制它们的显示与隐藏,二是控制它们的透明与否及背景. 在2 ...

  5. C#MongoDB使用实践

    9.5更新:更方便的启动命令 1)在D:\MongoDB中新建mongo.config文件,内容为 #启动mongod:mongod.exe --bind_ip 127.0.0.1 --logpath ...

  6. laravel 中 与前端的一些事5 之解决缓存问题:version

    Version的主要目的就是解决浏览器的缓存问题,在这个方面,Elixir给出的解决方案很完美 应用场景:当我们的css或者js重新更新了,我们需要告诉浏览器我们不要缓存的css或js静态文件样式时, ...

  7. linux 后台运行命令 nohup命令

    转载:http://if.ustc.edu.cn/~ygwu/blog/archives/000538.html 2005年04月18日 简单而有用的nohup命令在UNIX/LINUX中,普通进程用 ...

  8. 登陆界面Login

    最终界面:   XMAL 代码: <Grid > <Grid.RowDefinitions> <RowDefinition /> <RowDefinition ...

  9. MVC5与EF6 Code First 第一个入门完整实例教程

    mvc如今火的不行,我今天就来介绍一个MVC5与EF6开发的实际的入门实例,因为EF6默认是Code First的,所以我今天也就用EF6 的Code First来做一个简单的实例,为了让实例显得简单 ...

  10. ReferentialConstraint 中的依赖属性映射到由存储生成的列

    ReferentialConstraint 中的依赖属性映射到由存储生成的列 这个问题是由于从表中的外键关系建立错误(可能是由于误改),查看从表的所有外键关系,即可找到问题所在. 问题: 什么是从表? ...