博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Entity Framework 6 Recipes》中文翻译系列 (40) ------ 第七章 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读)...
阅读量:4982 次
发布时间:2019-06-12

本文共 3816 字,大约阅读时间需要 12 分钟。

 

7-5  从跟踪器中获取实体

问题

  你想创建一个扩展方法,从跟踪器中获取实体,用于数据保存前执行一些操作。

解决方案

  假设你有如图7-7所示的模型。

图7-7. 包含实体Technician和ServiceCall的模型

 

   在这个模型中,每个技术员(technician)都有一些业务服务请求(service call),业务服务请求包含联系人姓名,问题。使用代码清单7-4,创建一个扩展方法获取实体状态为Added、Modifed或者Unchanged的所有实体。

代码清单7-4. 创建一个扩展方法获取实体状态为Added、Modifed或者Unchanged的所有实体 

1  public static class Recipe5Program 2     { 3         public static void Run() 4         { 5             using (var context = new Recipe5Context()) 6             { 7                 var tech1 = new Technician { Name = "Julie Kerns" }; 8                 var tech2 = new Technician { Name = "Robert Allison" }; 9                 context.ServiceCalls.Add(new ServiceCall10                 {11                     ContactName = "Robin Rosen",12                     Issue = "Can't get satellite signal.",13                     Technician = tech114                 });15                 context.ServiceCalls.Add(new ServiceCall16                 {17                     ContactName = "Phillip Marlowe",18                     Issue = "Channel not available",19                     Technician = tech220                 });21 22                 //获取Added状态的实体23                 foreach (var tech in24                          context.ChangeTracker.GetEntities
())25 {26 Console.WriteLine("Technician: {0}", tech.Name);27 foreach (var call in tech.ServiceCalls)28 {29 Console.WriteLine("\tService Call: Contact {0} about {1}",30 call.ContactName, call.Issue);31 }32 }33 }34 35 }36 }37 public static class ChangeTrackerExtensions38 {39 public static IEnumerable
GetEntities
(this DbChangeTracker tracker)40 {41 var entities = tracker42 .Entries()43 .Where(entry => entry.State != EntityState.Detached && entry.Entity != null)44 .Select(entry => entry.Entity).OfType
();45 return entities;46 }47 }

代码清单7-4的输出如下:

Technician: Julie KernsService Call: Contact Robin Rosen about Can't get satellite signal.Technician: Robert AllisonService Call: Contact Phillip Marlowe about Channel not available

原理

  在代码清单7-4中,我们实现了扩展方法GetEntities<T>(),它获取上下中状态为Added,Modified,和Unchanged的所有实体。这是一个常用的方法,因此有理由只实现一次。在实现GetEntities<T>方法中,我们使用LINQ-to Entities过滤Entries<T>()方法的整个集合。这个方法返回所有的非Detached状态的条目。我们从返回结果集中过滤掉关系以及为null的条目,从剩下的条目中,我们只选择给定类型的条目。

  在许多重要场景中,你需要实现类似GetEntities<T>()方法的方法。比如,在SaveChanges事件中,你想验证插入、修改或者删除的实体。

 

 

 

 

 

7-6  从命令行生成模型

问题

  你想从命令行生成模型。

解决方案

  使用edmgen.exe程序,从命令行为一个给定的数据库生成模型。点击开始菜单中Microsoft Visual Studio2012下面的Visual Studio 2012 Command Prompt(命令提示),访问Visual Studio 2012命令提示工具。

  微软的官方文档为edmgen命令提供了完整的命令行选项说明。 edmgen命令提供了许多有用的命令行选项。例如,下面的命令,会从测试数据库中的所有表生成一个模型。

edmgen /mode:FullGeneration /project:Test /provider:"System.Data.SqlClient" /c:"server=localhost;integrated security=true;database=Test;"

  其它/model选项也是可以使用的。其中有一个在持续构建过程中很有用,它是/mode: ValidateArtifacts。使用该选项,可以生成一个或多个验证过的层。你可能会使用下面的选项中的一个或是全部/inssdl 或者/incsdl。如果你想验证映射层,那么模型中三层都必须指定。

  在为指定模型层生成文件时,你可以使用/out选项给文件命名。假如,使用 /outcsdl:MyProject.csdl,将创建一个包含概念层定义的文件,文件名为MyProject.csdl。其它层的用法与此相似。

原理

  edmgen命令提供了一种便捷的方式来自动构建模型,同时,它在预生成查询视图,为每个模型层生成独立文件方面,是一个很有用的工具。使用edmgen的一个限制是,它不能生成一个基于数据库表的一个子集合的模型。

  使用edmgen命令预生成视图,对一个应用的性能有极大的帮助。当一个查询被执行时,实体框架必须构建一系列的视图,这些视图用于访问和查询数据库。不使用edmgen实用工具,视图的生成会在第一次实体框架调用时。 如果数据模型很小的话,第一次的初始化,不会带来多大的风险。但是,如果数据模型非常大,或者非常复杂时,这样的性能影响是不能接受的。在这种情况下,我们有足够的理由来使用edmgen命令行实体工具

 

 

 

实体框架交流QQ群:  458326058,欢迎有兴趣的朋友加入一起交流

谢谢大家的持续关注,我的博客地址:http://www.cnblogs.com/VolcanoCloud/

 

转载于:https://www.cnblogs.com/VolcanoCloud/p/4543995.html

你可能感兴趣的文章
sync framework参考收集系列
查看>>
PHP-----正则表达式
查看>>
spring中bean生命周期
查看>>
Java Service Provider Interface
查看>>
对象的生命周期
查看>>
【DL】模型蒸馏Distillation
查看>>
iOS:为什么TCP连接要三次握手,四次挥手
查看>>
将博客搬至CSDN
查看>>
Mysql查询某字段重复值并删除重复值
查看>>
使用python获取微医数据
查看>>
使用pyinstaller 打包python程序
查看>>
ubuntu 上开发.netcore
查看>>
小程序索引列表排序
查看>>
vue使用video.js解决m3u8视频播放格式
查看>>
前端H5与安卓和ios之间通信
查看>>
7-7
查看>>
knn 数字识别
查看>>
dataframe
查看>>
股票分析
查看>>
concat merge
查看>>