Entity Framework 6新功能Logging/Store Procedure
摘要
在Entity Framework6中有两个新的功能,DB Loggin和Stored Procedure的映射
Entity Framework 6已经从Beta版本来到了RC1版本,我们可以看到升级之后EF6有两个亮眼的新功能,DB Logging和CRUD的Stored Procedure映射。
EF6从Beta到RC1添加了什么
在Visual Studio2013中要将原本项目采用的EF6 Beta升级到RC1是一件很简单事,只需要在套件管理主控台输入: update-package EntityFramework -pre
前置作业
首先建立一个测试用的模型:TestModel。
图1. TestModel
接下来撰写这个TestModels档案的内容:
01.
public
class
TestModel
02.
{
03.
[ Key]
04.
public
int
TestId {
get
;
set
; }
05.
public
string
TestName {
get
;
set
; }
06.
}
07.
08.
public
class
TestContext : DbContext
09.
{
10.
public
DbSet< TestModel> TestModels {
get
;
set
; }
11.
public
TestContext()
12.
:
base
(
"DefaultConnection"
)
13.
{ }
14.
15.
protected
override
void
OnModelCreating( DbModelBuilder mb)
16.
{
17.
mb.HasDefaultSchema(
"Test"
);
18.
base
.OnModelCreating(mb);
19.
}
20.
}
为了让整个Entity Framework启动起来,我们到HomeController中写一些无意义的程序代码:
1.
public
ActionResult Index()
2.
{
3.
using
( TestContext ctx =
new
TestContext())
4.
{
5.
ctx.TestModels.ToList();
6.
}
7.
return
View();
8.
}
按下F5执行整个项目后,由于是第一次加载且启动Entity Framework机制,故会等比较久。当首页开启来后检查一下数据库是否已建立TestModel这张数据表。
图2. SQL Server对象总管的画面
前置作业完成之后,接下来就把Entity Framework 6 RC1的两项新功能一一启用。
EF Code First - Stored Procedure映射
数据库产品有着许多与OR/M映射不匹配的状况,EF 6因此引入一个新的功能到Code First中,让开发人员能够更容易的操作数据库。欲在TestModel中启用Stored Procedure,只需在其Context的OnModelCreating方法中添加如下程序代码:
1.
protected
override
void
OnModelCreating(DbModelBuilder mb)
2.
{
3.
mb.HasDefaultSchema(
"Test"
);
4.
mb.Entity< TestModel>()
5.
.MapToStoredProcedures();
6.
base
.OnModelCreating(mb);
7.
}
MapToStoreProcedures()方法具有两个多载,其一为无参数,使用预设Code First的StoreProcedure建构方法来建立Stored Procedure;另一个则有一个Action型别的输入参数,让开发人员可以客制化目前现存的Stored Procedure其:名称,参数...等等。
如果在这个时候直接执行会发生错误,这是因为我已经修改了Code First中的Context程序,并且因此与数据库中现行的内容出现了差异,故需要在套件管理器中执行以下命令:
Enable-Migrations -ContextTypeName EF6Test.Models.TestContext
待执行完毕后,可以发现到项目的档案结构已经出现了一个名为Migrations的数据夹:
若单单只有启动Entity Framework的移转功能但却没有实际将我们本次修改的内容进行明确的宣告,则此次的修改仍不会被纪录起来;而每次修改Code First的POCO或是Context类别后都需要进行结构异动的移转宣告。本次异动移转宣告指令如下:
Add-Migration TestStoredProcedure
执行完命令后会在项目中新增一个[日期时间]_TestStoredProcedure的类别档,打开后可以看到其产生的StoredProcedure。
01.
public
partial
class
TestStoredProcedure : DbMigration
02.
{
03.
public
override
void
Up()
04.
{
05.
CreateStoredProcedure(
06.
"Test.TestModel_Insert"
,
07.
p =>
new
08.
{
09.
TestName = p.String(),
10.
},
11.
body:
12.
@"INSERT [Test].[TestModels]([TestName])
13.
VALUES (@TestName)
14.
DECLARE @TestId
int
15.
SELECT @TestId = [TestId]
16.
FROM [Test].[TestModels]
17.
WHERE @@ROWCOUNT > 0 AND [TestId] = scope_identity()
18.
SELECT t0.[TestId]
19.
FROM [Test].[TestModels] AS t0
20.
WHERE @@ROWCOUNT > 0 AND t0.[TestId] = @TestId"
21.
);
22.
23.
CreateStoredProcedure(
24.
"Test.TestModel_Update"
,
25.
p =>
new
26.
{
27.
TestId = p.Int(),
28.
TestName = p.String(),
29.
},
30.
body:
31.
@"UPDATE [Test].[TestModels]
32.
SET [TestName] = @TestName
33.
WHERE ([TestId] = @TestId)"
34.
);
35.
36.
CreateStoredProcedure(
37.
"Test.TestModel_Delete"
,
38.
p =>
new
39.
{
40.
TestId = p.Int(),
41.
},
42.
body:
43.
@"DELETE [Test].[TestModels]
44.
WHERE ([TestId] = @TestId)"
45.
);
46.
}
47.
48.
public
override
void
Down()
49.
{
50.
DropStoredProcedure(
"Test.TestModel_Delete"
);
51.
DropStoredProcedure(
"Test.TestModel_Update"
);
52.
DropStoredProcedure(
"Test.TestModel_Insert"
);
53.
}
54.
}
从上述程序代码可以看到DBMigration类别已经自动产出了Stored Procedure内容: Insert/Update/Delete。但却没有Select ??
接下要将Stored Procedure在数据库中建立,故,一样在套件管理控制台输入: update-database
图3. 更新数据库
使用DB Logging来监控EF的活动
DB Logging将EF与数据库之间的互动都纪录下来。早前有两个非常棒的ASP.Net套件:MiniProfiler以及Glimpse;它们让我们可以看到EF的SQL陈述句,如今,EF也提供了这项功能。DB Logging主要目标是提供:
1. 了解EF的Linq是怎么转译成SQL陈述句
2. 深入探索那些可能会造成执行时间过长的查询
3. 找出EF没有正确回传结果的原因
启动侦错很简单,仅需指派一个带字符串输入参数的Action对象即可。
1.
public
ActionResult Index()
2.
{
3.
using
(TestContext ctx =
new
TestContext()) {
4.
ctx.Database.Log = (log) => { Debug .WriteLine(log); };
5.
ctx.TestModels.ToList();
6.
}
7.
return
View();
8.
}
现在,当我们执行应用程序并且浏览到首页面。
假若我们打开侦错主控台窗口,我们会看到"Select ..."这个SQL陈述句共花费12ms于整个执行,而其回传结果为SqlDataReader。
图4. DB Logger所纪录的项目
整齐干净,假若我们想要客制化纪录的字符串呢?EF提供了许多扩充点可以让我们做出像是Glimpse的纪录和追踪功能。
Entity Framework 6新功能Logging/Store Procedure的更多相关文章
- Entity Framework 6新特性:全局性地自定义Code First约定
2012年12月11日,Entity Framework已经发布了Entity Framework 6 Alpha2,因项目需要,目前已使用了其中的两个特性,今天就来介绍一下第一个特性:全局性地自定义 ...
- 【EF】Entity Framework 6新特性:全局性地自定义Code First约定
应用场景 场景一:EF Code First默认使用类名作为表名,如果我们需要给表名加个前缀,例如将类名Category映射到表Shop_Category.将Product映射到Shop_Produc ...
- Visual Studio 2013 Preview - ASP.NET, MVC 5, Web API 2新功能搶先看
Visual Studio 2013 Preview - ASP.NET, MVC 5, Web API 2新功能搶先看 來自TechEd North America 2013的第一手消息 以下資訊均 ...
- Oracle官方版Entity Framework
千呼萬喚始出來! Oracle官方版Entity Framework問市,邁入開發新時代 自從我得了一種"不用LINQ就不會寫資料庫程式"的病,為了滿足工作上要搭配Oracle(雖 ...
- 学习Entity Framework 中的Code First
这是上周就写好的文章,是在公司浩哥的建议下写的,本来是部门里面分享求创新用的,这里贴出来分享给大家. 最近在对MVC的学习过程中,接触到了Code First这种新的设计模式,感觉很新颖,并且也体验到 ...
- 转载:学习Entity Framework 中的Code First
看完觉得不错,适合作为学习资料,就转载过来了 原文链接:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html 这是上周就写 ...
- Entity Framework 6 初体验
Entity Framework中有三种模式 Code First, Model First和Database First, Code First 是在EF4中新增的模式, 也跟NHibernate等 ...
- Entity Framework 代码先行
一.什么是Code First 为了支持以设计为中心的开发流程,EF还更多地支持以代码为中心 (code-centric) ,我们称为代码优先的开发,代码优先的开发支持更加优美的开发流程,它允许你在不 ...
- 初步了解Entity Framework
来源:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html Entity Framework的全称是ADO.NET Ent ...
随机推荐
- MySQL Administrator的简单操作
A.创建数据库 1.运行MySQL Administrator服务器,如下图. 2.点击"Catalogs",下面出现已有的数据库,右击已有的数据库,选择“Create New S ...
- lucene 简单搜索步骤
1.创建IndexReader实例: Directory dir = FSDirectory.open(new File(indexDir)); IndexReader reader = Direct ...
- Vagrant常用命令
Vagrant常用命令 Vagrant的几个命令: vagrant box add 添加box的操作 vagrant init 初始化box的操作 vagrant up 启动虚拟机的操作 vagran ...
- Linux相关
可以用secureCRT远程连接Linux系统,进入tomcat,并且启动tomcat:bin/startup.sh 查看实时日志状态:tail -f logs/catalina.out
- [转]html 移动互联网终端的javascript touch事件,touchstart, touchend, touchmove
前言 如果我们允许用户在页面上用类似桌面浏览器鼠标手势的方式来控制WEB APP,这个页面上肯定是有很多可点击区域的,如果用户触摸到了那些可点击区域怎么办呢??诸如智能手机和平板电脑一类的移动设备通常 ...
- uploadifive源码学习
一.简介 Uploadify是一个基于JQuery的多文件上传JS组件,高度定制,两个版本可供选择.flash版本在最新的Safari等不再支持flash的浏览器或者一些手机浏览器中就无法正常的加载使 ...
- android 优化
1. 使用原生Sqlite语句进行增删改查的操作,而不是使用ContentProvider来封装操作. 2. 对于需要一次性修改多个数据时,可以考虑使用SQLite的事务方式批量处理.
- 第四十节,requests模拟浏览器请求模块初识
requests模拟浏览器请求模块初识 requests模拟浏览器请求模块属于第三方模块 源码下载地址http://docs.python-requests.org/zh_CN/latest/use ...
- IoC容器Autofac正篇之类型关联(服务暴露)(八)
类型关联 类型关联就是将类挂载到接口(一个或多个)上去,以方便外部以统一的方式进行调用(看下例). 一.As关联 我们在进行手动关联时,基本都是使用As进行关联的. 1 2 3 4 5 6 7 8 ...
- crontab如何设置秒级别的定时【转载】
* * * * * date > /home/gamester88/test/nihao.txt * * * * * (sleep 10 && date >> /ho ...