MVC学习日记(三)EntityFramework
其实学会了第一篇的创建和第二篇的使用以后,基本的mvc操作足够了,至于验证神马的,还不如用Jquery、h5的好看适用,所以接下来, 后续上会讲一些比较实用的。
在之前的文章说到了基础的使用, 那么,如何让你的MVC程序,活起来呢? 这就必须要连接数据库了, 我所了解的有两种方法, 一种是我们熟知的映射模型,通过反射
得到数据库的结构模型,使用表生成器,讲对应的表反射出来,然后用Sql操作语句 , 操作对象。 另一种呢, 就是微软包里面的一款强大工具 EntityFramework了,
同样, EntityFramework 是一个数据库反射操作的模型,但是,机制上已经被编写, 可以很快速的使用,使用linq语句,可以数据库的限制,非常的实用(尤其是中下型项目),
接下来, 和大家介绍EF常见的三种创建模式。
第一种DataFirst , 数据优先创建模式, 和字面意思一样, 这样建立的EF模型,必须先有数据库。
为你的MVC项目,添加一个EF模型, 右键你的MVC项目 起个名字, 通常以XXXX Content结尾,(别问为什么,因为约定优先原则)
点击添加以后, 会自动让你选择模型, 左边的是database 数据优先 , 右边那个下面再说
选完连接方式, 接下来就是配置数据库的连接, 连接一下,没有连接过, 就New Connection... 按步骤走就是了
生成出来的东西都在 .edmx文件里面, 一个 .context.cs 文件,里面就是操作的关键
.cs 文件,里面的类模型, 和数据库里面数据表一一对应。
这就是数据优先的EF模型 ,那么 下面看看如何操作
比如设定一个 PersonController
里面的方法
var db = new AdventureWorkEntities(); //上下文类操作对象, 用于操作EF模型的
Public ActionResult Index()
{
List<Person> persons = from p in db.Person select p ;
}
View 上,
using 命名空间.Person类
@model 命名空间.Person类
@foreach(Person p in Model)
{
<p>
@p.name
@p.age
</P>
}
手打的, 大致思路, 大家参考, 多练习,会熟练的。
接下来叙述一下EntityFramework里的第二种方式,ModelFirst, 就是模型优先的原则, 顾名思义, 就是先建立模型, 关系,再生成数据库, 没错, 就EF帮你生成数据库, 你本人无需建立数据库。
开始一样, 到了这个时候,选右边的EntityModel, 这时候建立的就是一个Model优先的EF了
对应的,出现一张可操作的模型视图, 可以右键操作, 添加Model模型, 可以更新/添加数据库。
添加方式Model的方式也很简单, 以实体为操作对象,基本上按步骤走, 就能实现了, 和datafirst有很多类似。但是性能上,比datafirst要高,毕竟,优先级不一样了, 操作也不一样了。
最后一种codefirst是 3 之后出现的, 一种效率更高, 但是更新更麻烦的一种方式, 具体优劣, 看具体应用环境。
这种模式很好的解析了EF的运作过程
namespace CodeFirst
{
public class Order
{
public int Id { get; set; }
public string Customer { get; set; }
public System.DateTime OrderDate { get; set; } public virtual List<OrderDetail> OrderDetails { get; set; }
}
}
using System;
using System.Collections.Generic; namespace CodeFirst
{
public partial class OrderDetail
{
public int Id { get; set; }
public string Product { get; set; }
public string UnitPrice { get; set; }
public int OrderId { get; set; } public virtual Order Order { get; set; }
}
}
建立实体类, 反射的基础对象类
有了这两个类之后让我们定义一个数据库上下文,有了它我们就可以对数据进行增删改查操作了,这个类必须继承于"System.Data.Entity.DbContext”类以赋予它数据操作能力。因此接下来我们需要给这个应用安装EntityFramework包,因为到目前为止我们并没有引入EF框架相关的任何内容,我们需要引入EF相关程序集。但是我们有更好的选择那就是NuGet。通过NuGet进行在线安装:项目中右键选择"Manage NuGet Packages…”;选择Online;再选择“EntityFramework”;然后点击安装即可。不了解NuGet的朋友到这里看一下使用 NuGet 管理项目库。数据库上下文操作类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity; namespace CodeFirst
{
public class OrderContext:DbContext
{ public DbSet<Order> Orders
{
get;
set;
} public DbSet<OrderDetail> OrderDetails
{
get;
set;
}
}
}
然后我们进行测试,在这个类中我们首先创建了一个Order实例,接着编码查询:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace CodeFirst
{
class Program
{
static void Main(string[] args)
{
using (var ctx = new OrderContext())
{ var o = new Order();
o.OrderDate = DateTime.Now;
ctx.Orders.Add(o);
ctx.SaveChanges(); var query = from order in ctx.Orders
select order;
foreach (var q in query)
{
Console.WriteLine("OrderId:{0},OrderDate:{1}", q.Id, q.OrderDate);
} Console.Read();
}
}
}
}
如果是第一次使用EF Code First的朋友一定会有疑问,我们没有进行任何数据库配置,增加了一条数据通过查询确实保存上了,那么我们的数据到底在哪呢?事实上如果用户不进行数据库配置EF默认会使用“.\SQLEXPRESS”数据库实例,如果你没有安装“.\SQLEXPRESS”则默认使用LocalDb,关于LocalDb的具体细节请看:SQL Server 2012 Express LocalDB,例如我本机就存放在:“C:\Users\Kenshin”,可以看到创建了一个名为“CodeFirst.OrderContext”的数据库:
但是多数情况下我们是希望自己控制这个数据库的,例如我想让他保存在我机器上的”.\SQL2008”实例上,此时我们就需要在配置文件App.Config中配置一个数据库连接串,然后在我们的数据库上下文中指定这个连接名称。
配置文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="CodeFirstDb" connectionString="Data Source=.\SQL2008;Database=CodeFirstDb;UID=sa;PWD=123;" providerName="System.Data.SqlClient"></add>
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
</entityFramework>
</configuration>
OrderContext类,构造函数多了一个连接名参数:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity; namespace CodeFirst
{
public class OrderContext:DbContext
{
public OrderContext(string connectionName)
: base(connectionName)
{
} public DbSet<Order> Orders
{
get;
set;
} public DbSet<OrderDetail> OrderDetails
{
get;
set;
}
}
}
使用的时候,传入配置的数据库连接字符串名称:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace CodeFirst
{
class Program
{
static void Main(string[] args)
{
using (var ctx = new OrderContext("CodeFirstDb"))
{ var o = new Order();
o.OrderDate = DateTime.Now;
ctx.Orders.Add(o);
ctx.SaveChanges(); var query = from order in ctx.Orders
select order;
foreach (var q in query)
{
Console.WriteLine("OrderId:{0},OrderDate:{1}", q.Id, q.OrderDate);
} Console.Read();
}
}
}
}
执行之后就会发现在”.\SQL2008”实例上多了一个“CodeFirstDb”数据库(注意图中除了我们创建的两个实体表还有一个系统表dbo._MigrationHistory它记录了模型的定义,在以后的文章中我会着重解释此表):
MVC学习日记(三)EntityFramework的更多相关文章
- MVC学习(三)Code-First Demo
前面两篇文章介绍了DataBase-First例子,这里就介绍Code-First. 个人简单理解:就是在程序中编写代码,然后在数据库中生成相应的表.字段.约束等等.听上去蛮神奇的.Now,begin ...
- [MVC学习日记]2014/12/01 初步认识MVC模型。
2014/12/011.初步认识MVC模型.MVC模式是一种表现模式.它将web应用程序分成三个部分,模型(Model).视图(View).控制器(Controller).Model:是实现业务逻辑层 ...
- Python学习日记(三十六) Mysql数据库篇 四
MySQL作业分析 五张表的增删改查: 完成所有表的关系创建 创建教师表(tid为这张表教师ID,tname为这张表教师的姓名) create table teacherTable( tid int ...
- ASP.NET MVC 学习第三天
今天来简单说一下Razor视图引擎语法相关的和视图类. 添加一个MvcTest项目,继续添加一个Home控制器,完成index的视图添加.我们就在index这里分析razor视图引擎.下面是home控 ...
- spring MVC学习(三)
1. @RequestMapping: 在请求的路径中传递参数:参数作为路径的一部分,可以在路径中直接使用 {paramName}来表示,另一种就是更加传统的表示方式?paramName=paramV ...
- ASP.NET MVC学习---(三)EF简单增删改查
那么现在我们已经大概从本质上了解了ef 巴拉巴拉说了一大堆之后 总算要进入ef的正题了 总在口头说也太不行了是吧~ 没错,现在要用ef进行一些实际的操作 做什么呢? 就做一个入门级的增删改查操作吧 废 ...
- Python学习日记(三十八) Mysql数据库篇 六
Mysql视图 假设执行100条SQL语句时,里面都存在一条相同的语句,那我们可以把这条语句单独拿出来变成一个'临时表',也就是视图可以用来查询. 创建视图: CREATE VIEW passtvie ...
- Python学习日记(三十四) Mysql数据库篇 二
外键(Foreign Key) 如果今天有一张表上面有很多职务的信息 我们可以通过使用外键的方式去将两张表产生关联 这样的好处能够节省空间,比方说你今天的职务名称很长,在一张表中就要重复的去写这个职务 ...
- Python学习日记(三十三) Mysql数据库篇 一
背景 Mysql是一个关系型数据库,由瑞典Mysql AB开发,目前属于Oracle旗下的产品.Mysql是目前最流行的关系型数据库管理系统之一,在WEB方面,Mysql是最好的RDBMS(Relat ...
随机推荐
- JSP_内置对象_session
session表示客户端与服务器的一次会话. Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间. 从上述定义中可以看到,s ...
- js 验证文件格式和大小
<script> $('#btnSearch').click(function(){ // alert("000");// fileElem = document.ge ...
- vue移动端Ui组件 mint-ui 使用指南
1.上啦加载下拉刷新的使用 this.$refs.loadmore.onTopLoaded(); this.$refs.loadmore.onBottomLoaded(); 上啦刷新下拉加载的 动画显 ...
- html 报告页面样式
修改了下HTML页面样式 页面代码 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- 金蝶WAFII
- 蒟蒻的长链剖分学习笔记(例题:HOTEL加强版、重建计划)
长链剖分学习笔记 说到树的链剖,大多数人都会首先想到重链剖分.的确,目前重链剖分在OI中有更加多样化的应用,但它大多时候是替代不了长链剖分的. 重链剖分是把size最大的儿子当成重儿子,顾名思义长链剖 ...
- phpqrcode生成二维码
这篇文章讲解得非常详细: https://www.jb51.net/article/136418.htm 备注一下: 如果遇到生成的二维码是一串乱码.只需要在代码最后加上 exit();即可解决,原理 ...
- Python-Pandas简单操作
1.直接构建复杂嵌套索引 2. MultiIndex方式构建复杂的索引 多层索引操作 pandas堆叠处理
- Codeforces 805A/B/C
A. Fake NP 传送门:http://codeforces.com/contest/805/problem/A 本题是一个数学问题. 给定两个正整数l,r(l≤r),对于区间[l..r]上的任一 ...
- 1.sts的下载安装
sts的官方下载如下: http://spring.io/tools3/sts/all/ 将下载后的压缩文件解压,在解压后的sts-bundle下的sts-3.9.1RELEASE目录中STS.exe ...