Entity Framework 6 Recipes 2nd Edition(13-2)译 -> 用实体键获取一个单独的实体
问题
不管你用DBFirst,ModelFirst或是CodeFirst的方式,你想用实体键获取一个单独的实体.在本例中,我们用CodeFirst的方式.
解决方案
假设你有一个模型表示一个Painting(绘画)类型的实体,如Figure 13-2所示:

Figure 13-2. The Painting entity type in our model
在代码In Listing 13-2,我们创建实体类Painting.
public class Painting
{
public string AccessionNumber { get; set; }
public string Name { get; set; }
public string Artist { get; set; }
public decimal LastSalePrice { get; set; }
}
接下来,在代码Listing 13-3,我们创建DbContext对象(我们用CodeFirst方式时,EF的门户)
Listing 13-3. DbContext Object
public class Recipe2Context : DbContext
{
public Recipe2Context()
: base("Recipe2ConnectionString")
{
// Disable Entity Framework Model Compatibility
Database.SetInitializer<Recipe2Context>(null);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// map AccessionNumber as primary key to table
modelBuilder.Entity<Painting>().HasKey(x => x.AccessionNumber);
modelBuilder.Entity<Painting>().ToTable("Chapter13.Painting");
}
public DbSet<Painting> Paintings { get; set; }
}
接下来在项目里添加App.config,并把Listing 13-4代码添加到ConnectionStrings节下,
Listing 13-4. Connection String
<connectionStrings>
<add name="Recipe2ConnectionString"
connectionString="Data Source=.;
Initial Catalog=EFRecipes;
Integrated Security=True;
MultipleActiveResultSets=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
在代码Listing 13-5,我们装载数据,演示两种获取实体的方法:LinQ查询和Find()方法.
Listing 13-5. Retrieving an Entity with the Find() Method
private static void RunExample()
{
using (var context = new Recipe2Context())
{
context.Paintings.Add(new Painting
{
AccessionNumber = "PN001",
Name = "Sunflowers",
Artist = "Rosemary Golden",
LastSalePrice = 1250M
});
}
using (var context = new Recipe2Context())
{
// LINQ 查询总是会从数据库获取实体,即使实体已经存在于上下文中
var paintingFromDatabase =
context.Paintings.FirstOrDefault(x => x.AccessionNumber == "PN001");
// Find() 方法会从上下文中获取实体,如果不存在再从数据库获取
var paintingFromContext = context.Paintings.Find("PN001");
}
Console.WriteLine("Press <enter> to continue...");
Console.ReadLine();
}
它是如何工作的
当用LinQ查询时,它都会从数据库中获取所需的数据,即使这些数据已经被装载进了内存中的上下文(Context)对象里,当这个查询结束,如果实体尚不存在于上下文,那么则会被加入上下文,并且被跟踪.默认情况下,如果实体对象已经存在于上下文,它不会被从数据库新获取的数据重写.
然而,封装了实体对象的DbSet对象,暴露一个Find()方法,该方法需要提供一个主键参数.如组合主键,就需要给它传递一个数组.Find()方法是非常有效率的,它先会在上下文中查找目标对象,如果找到,它就直接从上下文中返回,如果找不到,它自动查询数据库,如果还是找不到,就返回null.另外,Find()方法可以返回一个已经被添加(状态为Added)但未保存到数据库的实体.而且Find()方法可以在三种方式中使用:DBFirst,ModelFirst,CodeFirst.
在Listing 13-5,我们先调用LinQ查询来获取一个Painting.图 Figure 13-3显示了产生的SQL查询

Figure 13-3. SQL Query returning our painting
接着的下行代码,我们用Find()方法来获取相同的实体,我们给它传递了一个主键参数(“PN001”),它首先在上下文对象中查找主键为PN001的实体,找到之后,返回该实体的一个引用,避免了对数据库查询.如图Figure 13-4所示,数据库中并没有SQL语句产生

Figure 13-4. The Find() method locates the object in memory, not generating a database query
查看 Find()方法的更多信息,请查看 Recipe 5-3.
Entity Framework 6 Recipes 2nd Edition(13-2)译 -> 用实体键获取一个单独的实体的更多相关文章
- Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新
因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...
- Entity Framework 6 Recipes 2nd Edition(9-1)译->用Web Api更新单独分离的实体
第九章 在N层结构的应用程序中使用EF 不是所有的应用都能完全地写入到一个单个的过程中(就是驻留在一个单一的物理层中),实际上,在当今不断发展的网络世界,大量的应用程序的结构包含经典的表现层,应用程, ...
- Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化
9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...
- Entity Framework 6 Recipes 2nd Edition(9-4)译->Web API 的客户端实现修改跟踪
9-4. Web API 的客户端实现修改跟踪 问题 我们想通过客户端更新实体类,调用基于REST的Web API 服务实现把一个对象图的插入.删除和修改等数据库操作.此外, 我们想通过EF6的Cod ...
- Entity Framework 6 Recipes 2nd Edition(13-3)译 -> 为一个只读的访问获取实体
问题 你想有效地获取只是用来显示不会更新的操作的实体.另外,你想用CodeFirst的方式来实现 解决方案 一个非常常见行为,尤其是网站,就是只是让用户浏览数据.大多数情况下,用户不会更新数据.在这种 ...
- Entity Framework 6 Recipes 2nd Edition(13-4)译 -> 有效地创建一个搜索查询
问题 你想用LINQ写一个搜索查询,能被转换成更有效率的SQL.另外,你想用EF的CodeFirst方式实现. 解决方案 假设你有如下Figure 13-6所示的模型 Figure 13-6. A s ...
- Entity Framework 6 Recipes 2nd Edition(13-5)译 -> 使POCO的修改追踪更高
问题 你正在使用POCO,你想提高修改跟踪的性能,同时使内存消耗更少.另外,你想通过EF的CodeFirst方式来实现. 解决方案 假设你有一个关于Account(帐户)和相关的Payments(支付 ...
- Entity Framework 6 Recipes 2nd Edition(13-8)译 -> 把昂贵的属性移到其它实体
问题 你想把一个昂贵的属性移到另一个实体,这样你就可以延迟加载当前这个实体.对于一个加载昂贵的而且很少用到的属性尤其有用. 解决方案 模型和上一节(Recipes 13-7)的一致,如Figure13 ...
- Entity Framework 6 Recipes 2nd Edition(13-9)译 -> 避免Include
问题 你想不用Include()方法,立即加载一下相关的集合,并想通过EF的CodeFirst方式实现. 解决方案 假设你有一个如Figure 13-14所示的模型: Figure 13-14. A ...
随机推荐
- Web性能优化:What? Why? How?
为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...
- 预览github里面的网页或dome
1.问题所在: 之前把项目提交到github都可以在路径前面加上http://htmlpreview.github.io/?来预览demo,最近发现这种方式预览的时候加载不出来css,js(原因不详) ...
- android通过webview调起支付宝app支付
webview在加载网页的时候会默认调起手机自带的浏览器加载网页,用户体验不好.但当用户设置浏览器客户端(setWebViewClient)设置这样的监听事件之后,当请求url的时候就不会打开手机自带 ...
- RabbitMq应用一的补充(RabbitMQ的应用场景)
直接进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完 ...
- CSS 3学习——box-sizing和背景
box-sizing 在CSS 2中设置元素的width和height仅仅是设置了元素内容区的宽和高,元素实际的尺寸是margin + border + padding + 内容区. CSS 3(截止 ...
- Python爬虫小白入门(四)PhatomJS+Selenium第一篇
一.前言 在上一篇博文中,我们的爬虫面临着一个问题,在爬取Unsplash网站的时候,由于网站是下拉刷新,并没有分页.所以不能够通过页码获取页面的url来分别发送网络请求.我也尝试了其他方式,比如下拉 ...
- [转载]一个标准java程序员的进阶过程
第一阶段:Java程序员 技术名称 内 容 说明 Java语法基础 基本语法.数组.类.继承.多态.抽象类.接口.object对象.常用类(Math\Arrarys\S ...
- Git快速入门
如果你不想看长篇的Git教程,想快速了解Git的使用,那么本文可能会对你入门Git有所帮助.由于笔者用的是Windows系统,所以本文只写Git在Windows上的使用. 一.Git安装 去Git官网 ...
- 2003-Can't connect to mysql server on localhost (10061)
mysql数据库出现2003-Can't connect to mysql server on localhost (10061)问题 解决办法:查看wampserver服务器是否启动,如果没有启动启 ...
- Oracle中的commit详解
本文转自 : http://blog.csdn.net/hzhsan/article/details/9719307 它执行的时候,你不会有什么感觉.commit在数据库编程的时候很常用,当你执行DM ...