问题

不管你用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)译 -> 用实体键获取一个单独的实体的更多相关文章

  1. Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新

    因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...

  2. Entity Framework 6 Recipes 2nd Edition(9-1)译->用Web Api更新单独分离的实体

    第九章 在N层结构的应用程序中使用EF 不是所有的应用都能完全地写入到一个单个的过程中(就是驻留在一个单一的物理层中),实际上,在当今不断发展的网络世界,大量的应用程序的结构包含经典的表现层,应用程, ...

  3. Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化

    9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...

  4. Entity Framework 6 Recipes 2nd Edition(9-4)译->Web API 的客户端实现修改跟踪

    9-4. Web API 的客户端实现修改跟踪 问题 我们想通过客户端更新实体类,调用基于REST的Web API 服务实现把一个对象图的插入.删除和修改等数据库操作.此外, 我们想通过EF6的Cod ...

  5. Entity Framework 6 Recipes 2nd Edition(13-3)译 -> 为一个只读的访问获取实体

    问题 你想有效地获取只是用来显示不会更新的操作的实体.另外,你想用CodeFirst的方式来实现 解决方案 一个非常常见行为,尤其是网站,就是只是让用户浏览数据.大多数情况下,用户不会更新数据.在这种 ...

  6. Entity Framework 6 Recipes 2nd Edition(13-4)译 -> 有效地创建一个搜索查询

    问题 你想用LINQ写一个搜索查询,能被转换成更有效率的SQL.另外,你想用EF的CodeFirst方式实现. 解决方案 假设你有如下Figure 13-6所示的模型 Figure 13-6. A s ...

  7. Entity Framework 6 Recipes 2nd Edition(13-5)译 -> 使POCO的修改追踪更高

    问题 你正在使用POCO,你想提高修改跟踪的性能,同时使内存消耗更少.另外,你想通过EF的CodeFirst方式来实现. 解决方案 假设你有一个关于Account(帐户)和相关的Payments(支付 ...

  8. Entity Framework 6 Recipes 2nd Edition(13-8)译 -> 把昂贵的属性移到其它实体

    问题 你想把一个昂贵的属性移到另一个实体,这样你就可以延迟加载当前这个实体.对于一个加载昂贵的而且很少用到的属性尤其有用. 解决方案 模型和上一节(Recipes 13-7)的一致,如Figure13 ...

  9. Entity Framework 6 Recipes 2nd Edition(13-9)译 -> 避免Include

    问题 你想不用Include()方法,立即加载一下相关的集合,并想通过EF的CodeFirst方式实现. 解决方案 假设你有一个如Figure 13-14所示的模型: Figure 13-14. A ...

随机推荐

  1. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  2. Akka.net路径里的user

    因为经常买双色球,嫌每次对彩票号麻烦,于是休息的时候做了个双色球兑奖的小程序,做完了发现业务还挺复杂的,于是改DDD重做设计,拆分服务,各种折腾...,不过这和本随笔没多大关系,等差不多了再总结一下, ...

  3. 散列表(hash table)——算法导论(13)

    1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...

  4. [APUE]标准IO库(上)

    一.流和FILE对象 系统IO都是针对文件描述符,当打开一个文件时,即返回一个文件描述符,然后用该文件描述符来进行下面的操作,而对于标准IO库,它们的操作则是围绕流(stream)进行的. 当打开一个 ...

  5. UWP开发之Mvvmlight实践七:如何查找设备(Mobile模拟器、实体手机、PC)中应用的Log等文件

    在开发中或者后期测试乃至最后交付使用的时候,如果应用出问题了我们一般的做法就是查看Log文件.上章也提到了查看Log文件,这章重点讲解下如何查看Log文件?如何找到我们需要的Packages安装包目录 ...

  6. RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密

    最近换了一份工作,工作了大概一个多月了吧.差不多得有两个月没有更新博客了吧.在新公司自己写了一个iOS的比较通用的可以架构一个中型应用的不算是框架的一个结构,并已经投入使用.哈哈 说说文章标题的相关的 ...

  7. JDBC Tutorials: Commit or Rollback transaction in finally block

    http://skeletoncoder.blogspot.com/2006/10/jdbc-tutorials-commit-or-rollback.html JDBC Tutorials: Com ...

  8. PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)

    最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...

  9. docker4dotnet #4 使用Azure云存储构建高速 Docker registry

    使用Docker来构建应用程序最常见的操作就是 docker run 或者 docker pull了,但是由于众所周知的原因,在国内想要高速稳定的获取docker hub上面的资源并不是件容易的事情, ...

  10. 《MySQL必知必会》学习笔记

    数据库:数据库是一种以某种有组织的方式存储的数据集合.其本质就是一个容器,通常是一个或者一组文件. 表:表示一种结构化的文件,可用来存储某种特定类型的数据. 模式:描述数据库中特定的表以及整个数据库和 ...