EF浅析及示例分析2

2024-05-25 20:58
文章标签 分析 示例 浅析 ef

本文主要是介绍EF浅析及示例分析2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

          上一篇博客我们提到了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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1002606

相关文章

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

mysql查询使用_rowid虚拟列的示例

《mysql查询使用_rowid虚拟列的示例》MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUM... 目录1. 基本查询(适用于没有主键的表)2. 检查表是否支持 _rowid3. 注意事项4. 最佳实