首页 > 代码库 > EF浅析及示例分析2

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=http://www.mamicode.com/"1">文本>
   更新操作:
	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