MVC中使用Entity Framework 基于方法的查询学习笔记 (二)

解释,不解释:

紧接上文,我们在Visual Studio2012中看到系统为我们自动创建的视图(View)文件Index.cshtml中,开头有如下这句话:

@model IEnumerable<GuestBook.Models.Book>

这句话是MVC通过强类型获取数据的方式,我们可以看出,在MVC视图中使用了IEnumerable<T>接口来循环读取数据并生成列表,该接口在System.Collections.Generic命名空间下。这就需要我们在控制器中传递的数据也是IEnumerable<T>类型的。

那么,我们是如何通过控制器将数据传递到视图中的哪?在MVC中我们使用数据上下文来存取数据,数据上下文是一个继承自DbContext基类的派生类,该类定义在System.Data.Entity命名空间下,DbContext 通常将与包含模型的根实体的 DbSet<TEntity> 属性的派生类型一起使用。 DbContext简化了实体与数据库的沟通细节,让我们可以专注于逻辑的开发,值得一提的是,在定义它的构造函数时可以使用基类的构造函数指明使用数据库的链接字符串,如下定义:

 public MVCGuestBookContext(): base("name=DefaultConnection"){}

在使用DbContext创建派生类的实例时,会自动初始化这些根实体的 DbSet<TEntity> 集合。在DbContext这个派生类中,我们可以定义类似上节中的

public DbSet<Book> Books { get; set; }

这是一个DbSet<Tentity>泛型集合类,它为数据上下文类提供了一个可以访问的属性,该属性指定的类型为我们定义的Model,如:我们定义的Book。因为该属性通过DbContext初始化,所以我们利用该属性的定义,就可以使用集合的操作方式对数据进行查看等等操作。比如我们上节中在控制器中定义了数据上下文对象:

private MVCGuestBookContext db = new MVCGuestBookContext();

我们就可以在Index动作中使用

 var data = db.Books.ToList();

来获取这个集合中的所有行,并通过动作中的ViewResult将data传递到视图中,如下:

return View(data);

视图页面通过@model 定义接收到这个data数据后,就可以使用@foreach (var item in Model) 遍历集合,得到想要的数据列表。

 

 DbContext类

我们常使用自定义的数据上下文类继承自DbContext类,因为DbContext帮我们隐藏了与数据库沟通的细节,仅仅通过构造函数时指明数据库链接字符串,就可以实现自动初始化类型为DbSet<Tentity>泛型集合类的属性。方便了我们对数据的存取。该类定义如下:

命名空间:  System.Data.Entity
程序集:  EntityFramework(在 EntityFramework.dll 中)

public class DbContext : IDisposable, IObjectContextAdapter

该类提供了一系列的属性和方法来进行操作,你可以仔细阅读MSDN中的介绍。

 

特别注释:

在构造函数中,其中有一个构造函数重载是指明链接字符串。

DbContext(String)    可以将给定字符串用作将连接到的数据库的名称或连接字符串来构造一个新的上下文实例。 请参见有关这如何用于创建连接的类备注。 

 在方法中,有一个SaveChanges()方法,该方法可以将在此上下文中所做的所有更改保存到基础数据库。 

SaveChanges    将在此上下文中所做的所有更改保存到基础数据库。

 

DbSet<TEntity> 类

DbSet<TEntity>类在数据上下文中主要作用在定义该类型的属性,利用这个属性可以方便对数据进行创建、读取、更新、删除等操作。该类定义如下:

命名空间:  System.Data.Entity
程序集:  EntityFramework(在 EntityFramework.dll 中)

[SuppressMessageAttribute("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix", Justification = "Name is intentional")]
public class DbSet<TEntity> : DbQuery<TEntity>, IDbSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable 
where TEntity : class

 从这个类定义中,我们可以看出它实现了DbQuery<TEntity>, IDbSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable 接口,这意味着,他可以使用这些接口提供的属性及方法来操作数据。

 

特别注释:

该类具有一些实用的方法可供我们使用,例如对数据进行操作的Add(),Find(),Remove(),需要重点介绍的是SqlQuery还可以使用原生的SQL语句执行操作,十分方便,你可以阅读http://www.cnblogs.com/mane/p/3387960.html文章详细了解,如下:

Add    将给定实体以“已添加”状态添加到集的基础上下文中,这样一来,当调用 SaveChanges 时,会将该实体插入到数据库中。
Find    查找带给定主键值的实体。 如果上下文中存在带给定主键值的实体,则立即返回该实体,而不会向存储区发送请求。 否则,会向存储区发送查找带给定主键值的实体的请求,如果找到该实体,则将其附加到上下文并返回。 如果未在上下文或存储区中找到实体,则返回 null
Remove    将给定实体标记为“已删除”,这样一来,当调用 SaveChanges 时,将从数据库中删除该实体。 请注意,在调用此方法之前,该实体必须以另一种状态存在于该上下文中。
SqlQuery    创建一个原始 SQL 查询,该查询将返回此集中的实体。 默认情况下,上下文会跟踪返回的实体;可通过对返回的 DbSqlQuery<TEntity> 调用 AsNoTracking 来更改此设置。 请注意返回实体的类型始终是此集的类型,而不会是派生的类型。 如果查询的一个或多个表可能包含其他实体类型的数据,则必须编写适当的 SQL 查询以确保只返回适当类型的实体。 

另外,该类还提供了丰富的扩展方法,你可以访问MSDN了解更多详情http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=ZH-CN&k=k(System.Data.Entity.DbSet`1);k(DbSet%3CUser%3E);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.0);k(DevLang-csharp)&rd=true

 

有了上面的知识,现在,我们可以修改上节中的文档实现简单的数据插入。

MVCGuestBookContext.cs 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;//

namespace GuestBook.Models
{public class MVCGuestBookContext : DbContext{public MVCGuestBookContext(): base("name=DefaultConnection"){}public DbSet<User> Users { get; set; }public DbSet<Book> Books { get; set; }}
}

HomeController.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using GuestBook.Models;namespace GuestBook.Controllers
{public class HomeController : Controller{private MVCGuestBookContext db = new MVCGuestBookContext();public ActionResult Index(){var user = db.Users.Find(3);db.Books.Add(new Book() { Id = 33, Body = "这是一个正文",PublishOn=DateTime.Now, User=user});db.SaveChanges();return View(db.Books.ToList());}}
}

 

 题外话:本人才疏学浅,所以不对的地方,还请各位高人指点迷津,下一节将讲述另外的几个类,以全面了解使用函数方式操作数据,本文所有内容都为本人理解而写,不代表官方定义!

转载于:https://www.cnblogs.com/mane/p/3396522.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

位运算(按位与、按位或、异或、取反)以及原码、反码、补码

参考&#xff1a;运算符的计算&#xff08;按位与 按位或 异或 取反&#xff09; 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-07-23 18:13:55 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107543919 参考&#xff1a;计算机原码&#…

Docker03 Docker基础知识、Docker实战

1 Docker基础知识 1.1 什么是Docker Docker是一个可以装应用的容器&#xff0c;就像杯子可以装水、书包可以装书一样&#xff1b;docker官网 Docker是Docker公司开发的&#xff0c;并开源到GitHub上; Docker是跨平台的&#xff0c;支持windows、linux、Macos 1.2 Docker思想 1.…

Java字符串简化_关于java查询语句 如何简化的问题

首先&#xff0c;请你告诉我你使用PreparedStatement的理由&#xff0c;为什么不使用Statement&#xff1f;二者有什么区别&#xff1f;然后 你用到了PreparedStatement的特性了吗&#xff1f;接下来我们在探讨这代码该怎么写。下面的代码仅供参考&#xff0c;基本不具有实践意…

phpcms_v9推送到其他栏目后再在其他栏目删除导致数据库出错

修改phpcms/model/content_model.class.php大概454行的update_category_items()函数private function update_category_items($catid,$action add,$cache 0) {$this->category_db pc_base::load_model(category_model);if($actionadd) {$this->category_db->update…

Linux网络编程小知识(字节序、IP格式、函数、子网掩码、DNS域名解析代码实现)

参考&#xff1a;网络编程前的一些小知识–Linux笔记 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2021-04-12 23:19:10 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/115560197 参考&#xff1a;DNS域名解析 作者&#xff1a;一只青木呀 发布…

java ndk 在哪_NDK简介

一、NDK简介&#xff1a;C/C的动态库。Dalvik通过JNI编程方式调用C/C代码。NDK编程提高软件性能&#xff0c;加密保护APK文件ndk-build NDK编译生成脚本Java编译时会根据java声明文件生成dex文件&#xff0c;即使没有java代码NDK共享库&#xff1a;NDK生成的 .so文件(类…

ARM汇编基础详解(PS学习汇编的原因)

目录前言1.GNU 汇编语法2.Cortex-A7 常用汇编指令2.1 处理器内部数据传输指令&#xff08;内部寄存器数据非内存数据&#xff09;2.2 存储器访问指令&#xff08;RAM&#xff09;2.3 压栈和出栈指令&#xff08;了解&#xff09;2.4 跳转指令2.5 算术运算指令2.6 逻辑运算指令前…

java formatter()_Java Formatter locale()用法及代码示例

locale()方法是java.util.Formatter的内置方法&#xff0c;该方法返回语言环境。此区域设置由格式化程序构造设置。具有语言环境参数的该对象的format方法不会更改此值。用法&#xff1a;public Locale locale()参数&#xff1a;该函数不接受任何参数。返回值&#xff1a;如果未…

linux中tree命令

需要安装tree包(安装&#xff1a;yum -y install tree)。 tree命令的选项说明如下&#xff1a; 【 匹配选项&#xff1a;】 -L&#xff1a;用于指定递归显示的深度&#xff0c;指定的深度必须是大于0的整数。 -P&#xff1a;用于显示统配符匹配模式的目录和文件&#xff0c;但是…

查看LINUX进程内存占用情况

可以直接使用top命令后&#xff0c;查看%MEM的内容。可以选择按进程查看或者按用户查看&#xff0c;如想查看oracle用户的进程内存使用情况的话可以使用如下的命令&#xff1a; (1)top top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况…

ARM(IMX6U)裸机汇编LED驱动实验——驱动编写、编译链接起始地址、烧写bin文件到SD卡中并运行

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机汇编LED驱动实验–驱动编写 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-07 09:13:48 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107851318 参考&#xff1a;Linux之…

Tools: geos 使用指南

1. 下载geos 2. 进入VS开发人员命令提示3、依次执行如下命令 >VCVARS32.BAT>cd D:\DevTool\geos-3.7.0>atuogen.bat>nmake /f makefile.vc> 编译成功后&#xff0c;会在D:\DevTool\geos-3.7.0\src目录下生成geos.lib, geos_i.lib, geos_c_i.lib, geos.dll, geos…

java 面试 概率论_编程培训-115个Java面试题和答案B.pdf

编程培训-115个Java面试题和答案B.pdf “玩转”Java系列 1 题目115个Java面试题和答案终极(下) 第一篇讨论了面向对象编程和它的特点&#xff0c;关于Java和它的功能的常见问题&#xff0c;Java的集合类&#xff0c; 垃圾收集器&#xff0c;本章主要讨论异常处理&#xff0c;Ja…

An Introduction to Our Code Breaking Team

小朋友们大家好&#xff0c;知道我们是谁吗&#xff1f;对了&#xff0c;我们就是Team Code Breaking&#xff01; 关于这个队名&#xff0c;我们讨论了很久&#xff0c;这个Code Breaking似乎是来源于某部电影&#xff0c;又似乎是来源于某本小说&#xff0c;或许单纯地只是觉…

ARM(IMX6U)裸机之I.MX6ULL硬件启动方式的选择

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机之I.MX6ULL启动方式详解 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-09 16:32:07 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107891591 目录启动方式的选择①.串行下…

python 操作mongo

1.  导包&#xff1a; import pymongo 2.  建立连接 client pymongo.MongoClient("127.0.0.1",27017) 3.  获取数据库 db client["test1"] 4.  获取集合 col db["t2"] 5.  插入数据&#xff1a; col.insert_one({ name:aa , age:2 …

java 混码_kotlin java 混合代码 maven 打包实现

kotlin简介kotlin是一种针对java 平台的新编程语言。kotlin简洁、安全、务实&#xff0c;并且专注于与java代码的互操作性。它几乎可以用在现在java使用的任何地方&#xff1a;服务端开发、android应用等等。kotlin 可以很好地和所有现存的java库和框架一起工作&#xff0c;而且…

w3 protocol

http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

ARM(IMX6U)裸机之I.MX6ULL启动头文件详解(内部BOOT ROM、IVT + Boot data + DCD + led.bin)

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机之I.MX6ULL镜像烧写以及启动头文件的详解 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-09 17:10:00 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107895975 目录BOOT R…

oracle日期函数

ORACLE日期函数大全&#xff01;2009-03-12 14:16:10日期函数 Oracle PL/SQL Oracle的日期函数相信很多人都有过统计某些数据的经历&#xff0c;比如&#xff0c;要统计财务的情况&#xff0c;可能要按每年&#xff0c;每季度&#xff0c;每月&#xff0c;甚至每个星期来分别统…