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(9-1)译-用Web Api更新单独分离的实体
第九章 在N层结构的应用程序中使用EF 不是所有的应用都能完全地写入到一个单个的过程中(就是驻留在一个单一的物理层中),实际上,在当今不断发展的网络世界,大量的应用程序的结构包含经典的表现层,应用程, ...
- 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(10-6)译 - TPT继承模型中使用存储过程
10-6. TPT继承模型中使用存储过程 问题 想在一个TPT继承模型中使用存储过程 解决方案 假设已有如Figure 10-6所示模型. 在模型里, Magazine(杂志) and DVD继承于基 ...
- Entity Framework 6 Recipes 2nd Edition(9-2)译-用WCF更新单独分离的实体
9-2. 用WCF更新单独分离的实体 问题 你想通过WCF为一个数据存储发布查询,插入,删除和修改,并且使这些操作尽可能地简单 此外,你想通过Code First方式实现EF6的数据访问管理 解决方案 ...
- Entity Framework 6 Recipes 2nd Edition(9-7)译-在WCF服务中序列化代理
9-7. 在WCF服务中序列化代理 问题 从一个查询里返回一个动态代理对象,想要把它序列为一个POCO(Plain-Old CLR Objects)对象. 实现基于POCO实体对象, 在运行时,EF会 ...
- Entity Framework 6 Recipes 2nd Edition(12-1)译 - 当SaveChanges( ) 被调用时执行你的代码...
第12章定制EF 在本章的小节里,定制实体对象和EF处理的一些功能.这些小节将涵盖很多"幕后"的事情,能让你的代码更加统一解决一些事情,比如用一个业务规则中心统一地为实体执行验证. ...
- Entity Framework 6 Recipes 2nd Edition(10-5)译 - 在存储模型中使用自定义函数
10-5. 在存储模型中使用自定义函数 问题 想在模型中使用自定义函数,而不是存储过程. 解决方案 假设我们数据库里有成员(members)和他们已经发送的信息(messages) 关系数据表,如Fi ...
- Entity Framework 6 Recipes 2nd Edition(10-3)译 - 返回结果是一个标量值
10-3. 返回结果是一个标量值 问题 想取得存储过程返回的一个标量值. 解决方案 假设我们有如Figure 10-2所示的ATM机和ATM机取款记录的模型 Figure 10-2. 一个ATM机和A ...
- Entity Framework 6 Recipes 2nd Edition(11-5)译 - 从”模型定义”函数返回一个匿名类型...
11-5. 从"模型定义"函数返回一个匿名类型 问题 想创建一个返回一个匿名类型的"模型定义"函数 解决方案 假设已有游客(Visitor) 预订(reserv ...
最新文章
- Tensorflow源码解析3 -- TensorFlow核心对象 - Graph
- oracle 如何查看oracle数据库版本
- 云炬Android开发笔记 4单Activity界面架构设计与验证
- Qt 遍历目录并删除目录下所有文件
- 第一章初始mybatis框架
- RPM 软件包名中的 el5、el6、el7 是什么?
- Redis 3.0.2集群搭建以及相关问题汇总
- 35款非常有创意的透明名片设计作品
- 西瓜书+实战+吴恩达机器学习(一)机器学习基础(数据集划分、分类回归评估指标)
- [leetcode]227. 基本计算器 II
- Latex beamer 学习总结
- RAID5阵列掉盘显示未初始化---解决过程
- 解决:cannot deserialize from Object value (no delegate- or property-based Creator)
- windows下cmd 查找/关闭端口
- 计算机控制中的pid是什么意思,PID 是什么意思
- 线性丢番图方程的C++实现
- vux以插件方式调用
- CreateJS 学习4 动画、TweenJS
- charts中各种图演示
- 雷军创业十年演讲全文!创业艰辛、乘风破浪、一往无前