《Entity Framework 6 Recipes》中文翻译系列 (40) ------ 第七章 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读)
翻译的初衷以及为什么选择《Entity Framework 6 Recipes》来学习,请看本系列开篇
7-5 从跟踪器中获取实体
问题
你想创建一个扩展方法,从跟踪器中获取实体,用于数据保存前执行一些操作。
解决方案
假设你有如图7-7所示的模型。

图7-7. 包含实体Technician和ServiceCall的模型
在这个模型中,每个技术员(technician)都有一些业务服务请求(service call),业务服务请求包含联系人姓名,问题。使用代码清单7-4,创建一个扩展方法获取实体状态为Added、Modifed或者Unchanged的所有实体。
代码清单7-4. 创建一个扩展方法获取实体状态为Added、Modifed或者Unchanged的所有实体
public static class Recipe5Program
{
public static void Run()
{
using (var context = new Recipe5Context())
{
var tech1 = new Technician { Name = "Julie Kerns" };
var tech2 = new Technician { Name = "Robert Allison" };
context.ServiceCalls.Add(new ServiceCall
{
ContactName = "Robin Rosen",
Issue = "Can't get satellite signal.",
Technician = tech1
});
context.ServiceCalls.Add(new ServiceCall
{
ContactName = "Phillip Marlowe",
Issue = "Channel not available",
Technician = tech2
}); //获取Added状态的实体
foreach (var tech in
context.ChangeTracker.GetEntities<Technician>())
{
Console.WriteLine("Technician: {0}", tech.Name);
foreach (var call in tech.ServiceCalls)
{
Console.WriteLine("\tService Call: Contact {0} about {1}",
call.ContactName, call.Issue);
}
}
} }
}
public static class ChangeTrackerExtensions
{
public static IEnumerable<T> GetEntities<T>(this DbChangeTracker tracker)
{
var entities = tracker
.Entries()
.Where(entry => entry.State != EntityState.Detached && entry.Entity != null)
.Select(entry => entry.Entity).OfType<T>();
return entities;
}
}
代码清单7-4的输出如下:
Technician: Julie Kerns
Service Call: Contact Robin Rosen about Can't get satellite signal.
Technician: Robert Allison
Service 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/
《Entity Framework 6 Recipes》中文翻译系列 (40) ------ 第七章 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读)的更多相关文章
- 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...
- 《Entity Framework 6 Recipes》中文翻译系列 (41) ------ 第七章 使用对象服务之标识关系中使用依赖实体与异步查询保存
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-7 标识关系中使用依赖实体 问题 你想在标识关系中插入,更新和删除一个依赖实体 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (39) ------ 第七章 使用对象服务之配置模型和使用单复数服务
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-3 配置模型 问题 你想了解配置模型中的各种选项. 解决方案 当你添加一个AD ...
- 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述
微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...
- 《Entity Framework 6 Recipes》翻译系列 (5) -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模
2-3 无载荷(with NO Payload)的多对多关系建模 问题 在数据库中,存在通过一张链接表来关联两张表的情况.链接表仅包含连接两张表形成多对多关系的外键,你需要把这两张多对多关系的表导入到 ...
- 《Entity Framework 6 Recipes》翻译系列 (4) -----第二章 实体数据建模基础之从已存在的数据库创建模型
不知道对EF感兴趣的并不多,还是我翻译有问题(如果是,恳请你指正),通过前几篇的反馈,阅读这个系列的人不多.不要这事到最后成了吃不讨好的事就麻烦了,废话就到这里,直奔主题. 2-2 从已存在的数据库创 ...
- 《Entity Framework 6 Recipes》翻译系列(2) -----第一章 开始使用实体框架之使用介绍
Visual Studio 我们在Windows平台上开发应用程序使用的工具主要是Visual Studio.这个集成开发环境已经演化了很多年,从一个简单的C++编辑器和编译器到一个高度集成.支持软件 ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
- 《Entity Framework 6 Recipes》中文翻译系列 目录篇 -持续更新
为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...
随机推荐
- vim 基本使用
vim 下基本命令 重新加载 .vimrc source ~/.vimrc 列出当前缓冲区的所有文档 ls 然后使用 b+编号 移至该文档 选中多行 v + shift 然后 j k 上下移动 缩进单 ...
- 从vue1.0到vue2.0遇到的一些问题的记录
1.取消v-el的使用方式,改为refs使用 获取指定的dom元素 html:<div ref="div"></div> js: $refs.div 问题: ...
- csv
csv 文件的读写:http://www.cnblogs.com/fiozhao/p/3225112.html 求取一个立方体的对角线穿个的边长为1的正方体的个数:http://www.cnblogs ...
- 遍历datatable的方法
+方法一:DataTable dt = dataSet.Tables[0];for(int i = 0 ; i < dt.Rows.Count ; i++){string strName = d ...
- 关于C#开发WEB项目TextBox控件的自适应高问题解决办法!
前两天做WEB开发时候遇到了一个小问题TextBox 控件要根据输入的内容多少自动改变大小,并且这个大小要求是在本页面内最大化.也就是 Width="100%" Height=&q ...
- 使用canal分析binlog(一) 入门
canal介绍 canal是应阿里巴巴存在杭州和美国的双机房部署,存在跨机房同步的业务需求而提出的.早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求.不过早期的数据库同步 ...
- VMware创建Linux虚拟机并安装CentOS(二)
在VMware中鼠标单击“编辑虚拟机设置”,在弹出的“虚拟机设置”对话框中的“硬件”标签中选择“CD/DVD(IDE)”,然后在右侧的“CD/DVD(IDE)”连接选项中选择“使用ISO映像文件”,使 ...
- ubuntu14.04 安装 hadoop2.4.0
转载:ubuntu搭建hadoop-Ver2.6.0完全分布式环境笔记 自己在搭建hadoop平台时,碰到一些困难,按照该博文解决了问题,转载一下,作为记录. 2 先决条件 确保在你集群中的每个节点上 ...
- <十三>JDBC_dbcp数据库连接池
配置文件:jdbc.properties username=rootpassword=kkdriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://1 ...
- 对Java初学者的忠告
1) 适合自己的图书才是最好的,最好的书并不一定适合你,看自己的情况. 如果你是一个Java初学者一上手就捧一本Thinking in Java在手里,我想你的日子是不会好过的,那样的书给有一定基础的 ...