• 摘要

      在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 { getset; }
      05.public string TestName { getset; }
      06.}
      07. 
      08.public class TestContext : DbContext
      09.{
      10.public DbSet< TestModel> TestModels { getset; }
      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的更多相关文章

  1. Entity Framework 6新特性:全局性地自定义Code First约定

    2012年12月11日,Entity Framework已经发布了Entity Framework 6 Alpha2,因项目需要,目前已使用了其中的两个特性,今天就来介绍一下第一个特性:全局性地自定义 ...

  2. 【EF】Entity Framework 6新特性:全局性地自定义Code First约定

    应用场景 场景一:EF Code First默认使用类名作为表名,如果我们需要给表名加个前缀,例如将类名Category映射到表Shop_Category.将Product映射到Shop_Produc ...

  3. 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的第一手消息 以下資訊均 ...

  4. Oracle官方版Entity Framework

    千呼萬喚始出來! Oracle官方版Entity Framework問市,邁入開發新時代 自從我得了一種"不用LINQ就不會寫資料庫程式"的病,為了滿足工作上要搭配Oracle(雖 ...

  5. 学习Entity Framework 中的Code First

    这是上周就写好的文章,是在公司浩哥的建议下写的,本来是部门里面分享求创新用的,这里贴出来分享给大家. 最近在对MVC的学习过程中,接触到了Code First这种新的设计模式,感觉很新颖,并且也体验到 ...

  6. 转载:学习Entity Framework 中的Code First

    看完觉得不错,适合作为学习资料,就转载过来了 原文链接:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html 这是上周就写 ...

  7. Entity Framework 6 初体验

    Entity Framework中有三种模式 Code First, Model First和Database First, Code First 是在EF4中新增的模式, 也跟NHibernate等 ...

  8. Entity Framework 代码先行

    一.什么是Code First 为了支持以设计为中心的开发流程,EF还更多地支持以代码为中心 (code-centric) ,我们称为代码优先的开发,代码优先的开发支持更加优美的开发流程,它允许你在不 ...

  9. 初步了解Entity Framework

    来源:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html Entity Framework的全称是ADO.NET Ent ...

随机推荐

  1. List<string> to List<decimal> by C# 2.0

    List<" } ); List<decimal> temp = data.ConvertAll<decimal>(delegate(string x) { r ...

  2. 十三、oracle 数据字典和动态性能视图

    一.概念数据字典是oracle数据库中最重要的组成部分,它提供了数据库的一些系统信息.动态性能视图记载了例程启动后的相关信息. 二.数据字典1).数据字典记录了数据库的系统信息,它是只读表和视图的集合 ...

  3. JavaScript(5)——DOM

    DOM操作 为了写这一篇随笔真的是费了好多力气,虽然还是写不好.本来是从周一都开始写的,但是周二周三忙着去帮忙招新了,哈哈哈.感觉做自己喜欢的事特别好玩,虽然挺忙的.看着那些小鲜肉,感觉自己真的老了啊 ...

  4. HDU 5366 The mook jong

    先暴力写了一个DFS,然后找规律.. #include<cstdio> #include<cstring> #include<cmath> #include< ...

  5. 关于malloc和free函数的用法

    原文:http://blog.pfan.cn/vfdff/33507.html 个人总结 在C语言的学习中,对内存管理这部分的知识掌 握尤其重要!之前对C中的malloc()和free()两个函数的了 ...

  6. YII2 小部件(widgets)

    小部件基本上在views中使用,在视图中可调用 yii\base\Widget::widget() 方法使用小部件. 该方法使用 配置 数组初始化小部件并返回小部件渲染后的结果. 例如如下代码插入一个 ...

  7. 论深度优先(DFS)和广度优先搜索(BF)的优点及不足(更新ing)

    例题: POJ 1915 Knight Moves 骑士遍历问题(跳马问题) 在一个m*m的棋盘上,从任意一个给定的位置(sx , sy)出发,为象棋中的马找一条路通过最少的步数到达另一位置(ex , ...

  8. OPENWRT make defconfig错误之一

    make defconfig rm: cannot remove `tmp/.host.mk': Permission denied 退到trunk上级目录 su root sudo chown -R ...

  9. 终于购入Mac mini,发现HDMI接口与显示器不兼容,网购了一个VGA转换插头

    Mac mini买到了,最便宜的i5,$647,足够了. 发现路边捡的显示器没有HDMI接口,所以在学校图书馆问了一下IT 技术支持,给我推荐了ebay上$10块钱的转换器. 名字叫 Mini Dis ...

  10. 设置ubuntu 默认不启动图形界面

    设置ubuntu 默认不启动图形界面 一. 编辑文件/etc/X11/default-display-manager 如果值为/usr/sbin/gdm,则进入图形界面如果值为false,则进入控制台 ...