EF浅析及示例分析2
来源:互联网 发布:js在线压缩 编辑:程序博客网 时间:2024/06/06 16:39
上一篇博客我们提到了EntityFrameWork的使用好处和创建方法,这篇博客,继续讨论EntityFrameWork的使用。我们从EntityFrameWork的结构和使用两方面来讨论。
我们使用mvc模式来完成示例代码。上篇博客使用DBfirst生成模型结构如下图:
使用DBFirst生成的实体模型是一个以.edmx结尾的文件,展开这个文件,会看到一下这张图的四个文件。.Context.tt文件中存放的是整个实体的信息。
Blog.tt文件中存放的是模型中各个子实体的内容。如下图所示:
好了,现在使用创建的这个实体模型,写个小Demo,实现几个基本操作。
先做查询,我们现在要将BlogArticle中所有的内容显示出来。示例代码如下:
Controller代码:
<pre name="code" class="csharp">public class HomeController : Controller {// 实例化实体模型,可以减少代码中的命名空间的重复。OumindBlogEntities db = new OumindBlogEntities();public ActionResult Index() {//1 查询 数据库里的 文章数据(通过执行 EF) //1.1 第一种方式,使用SQO(标准查询运算符),查询所有未软删除的数据//直接将返回的DBQuery转换成List<T> 集合,也就是理解查询数据库,并且返回查询的结果 //List<Models.T_News> list = db.T_News.Where(d => d.AIsDel == false).ToList();// 1.2 第二种方式:使用linq语句List<Models.BlogArticle> list = (from b in db.BlogArticle where b.AIsDel ==false select b).ToList ();ViewData["DataList"] = list; // 3 加载视图 return View(); } }
代码说明:使用泛型集合存储查询到的内容,使用linq表达式查询未软删除的数据,使用ViewData获取,并且显示数据。
View代码:
@{ ViewBag.Title = "Index";}<h2>Index</h2><html><head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head><body> <table> <tr> <th>id</th> <th>标题</th> <th>分类</th> <th>状态</th> <th>时间</th> <th>操作</th> </tr> <!--遍历Action方法设置给 ViewData的集合数据,生成HTML代码-->> @foreach (BlogArticle a in ViewData["DataList"] as List<BlogArticle >) { <tr> <td>id</td> <td>@a.AId</td> <td>@a.ATitle </td> <td>@a.BlogArticleCate.Name</td> <td>@a.Enumeration.e_cname </td> <td>@a.AAddtime </td> </tr> } </table></body></html>
删除示例代码(接上例):
<span style="white-space:pre"></span>public ActionResult Del(int id) { try { //1 创建要删除的对象 BlogArticle modledel = new BlogArticle() { AId = id }; // 2 将对象添加到 EF 管理容器 db.BlogArticle.Attach(modledel); //3 将对象包装类的状态 改为删除 db.BlogArticle.Remove(modledel ); // 4 更新到数据库 db.SaveChanges(); // 5 更新成功,浏览器重定向到 /Home/Index方法 return RedirectToAction("Index","Home"); } catch (Exception ex) { return Content("删除失败~~~" + ex.Message ); } }
说明:页面显示中,我们在删除时,传入一个主键id,作为删除标识,删除时,根据id删除记录。
更新示例代码:更新分为两部分,第一部分,首先需要将需要修改的内容重新显示为一个页面,然后在新的页面进行修改,提交,利用重载方法实现。
修改页面代码:
public ActionResult Modify(int id) { // 1 根据id 获得数据库数据,返回的集合中取出第一个实体对象 BlogArticle art = (from a in db.BlogArticle where a.AId == id select a).FirstOrDefault(); //2 生成文章分类列表集合<option value="1">文本</option> IEnumerable <SelectListItem > listItem = (from c in db.BlogArticleCate where c.IsDel == false select c).ToList() .Select( c=> new SelectListItem { Value = c.Id.ToString(), Text = c.Name }); //将listItem使用viewbag传递到前台 ViewBag.CateList = listItem; // 3 将art试图传递给界面 //方法1 ViewBag //方法2 ViewData //方法3 “加载”时,使用视图的构造函数,将数据传递给 名为model的属性 return View(art); }
更新操作:public ActionResult modify(BlogArticle model) { try { //将实体对象放入EF容器中,并获取伪包装类对象 DbEntityEntry<BlogArticle> entry = db.Entry<BlogArticle>(model); //将对象状态设置为为改变,后边需要单独改变 entry.State = System.Data.EntityState.Unchanged; //设置被改变属性的状态 entry.Property(a => a.ATitle).IsModified = true; entry.Property(a => a.AContent).IsModified = true; entry.Property(a => a.ACate).IsModified = true; //提交到数据库,完成修改 db.SaveChanges(); // 5 更新成功,浏览器重定向到 /Home/Index方法 return RedirectToAction("Index", "Home"); } catch (Exception ex) { return Content("修改失败~~~" + ex.Message); } }
删除和更新时,使用了EF管理容器。EF会为每个实体对象创建一个代理包装类对象,它会跟踪每个实体对象的状态和每个属性的状态,我们使用容器的功能来实现对象或者属性的操作。删除操作使用对象容器,通过修改对象状态,实现删除操作;更新操作中,使用容器跟踪对象属性的状态,通过更新属性状态,实现属性的更新操作。
通过使用EntityFrameWork实现了程序和数据库的解耦,程序员用处理对象的方式来操作数据,这样就可以节省更多的时间用来处理系统逻辑,为软件开发带来了便利。
- EF浅析及示例分析2
- EF浅析及示例分析
- 三层浅析及示例分析
- 三层浅析及示例分析
- ThreadLocal示例及源码浅析
- 浅析ListenableFuture使用场景及介绍示例
- MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例
- ef操作基类示例
- EF的分析
- 浅析ajax请求json数据并用js解析(示例分析)
- linux子系统分析及触摸屏驱动浅析
- linux子系统分析及触摸屏驱动浅析
- 浅析可变参数列表及实例分析
- 【EF映射】EF原理及延迟加载
- 换零钱算法分析及代码示例
- tcpdump用法及包分析示例
- 内存损坏问题的示例及分析
- arcgis中的应用分析及示例
- yum 安装过程下载的包存放路径
- 团队代码质量提升之我见
- Eclipse中文乱码终极解决方法
- 输入三个字符串,按从小到大的顺序输出。
- UIActivityIndicatorView的详细使用
- EF浅析及示例分析2
- 函数和字符串排序
- 代码评审会议指引
- java Calendar详解
- 优秀品质金字塔
- asp.net GridView多行表头的实现,合并表头
- bootstrap的form表单控件的事例
- 求时间差 TimeSpan
- ubuntu14.04(X64) qt5.4.0 + vtk6.1.0 Install (安装记录)