10-6. TPT继承模型中使用存储过程

问题

想在一个TPT继承模型中使用存储过程

解决方案

假设已有如Figure 10-6所示模型. 在模型里, Magazine(杂志) and DVD继承于基类Media(媒体,译注:示例数据库中的表名其实为:Medium,你在做例子或是下文代码出现Medium,请自己辨别). 在数据库里,每个实体各自有一个表,我们用TPT方式为为些表建模.我们想用一个存储过程从数据库中为这些模型来获取数据。

Figure 10-6. A model using Table per Type inheritance. The model represents some information about magazines and DVDs

===================================================================

■■提示:如果需要复习TPT模式和它的性能影响?请查阅第2章的2-8小节

========================================================================================

接下来创建存储过程及使用它获取实体

1.在数据库中创建如 Listing 10-15所示的存储过程.

Listing 10-15. The GetAllMedia Stored Procedure That Returns a Rowset with a Discriminator Column

create procedure [Chapter10].[GetAllMedia]

as

begin

select m.MediaId,c.Title,m.PublicationDate, null PlayTime,'Magazine' MediaType

from chapter10.Media c join chapter10.Magazine m on c.MediaId = m.MediaId

union

select d.MediaId,c.Title,null,d.PlayTime,'DVD'

from chapter10.Media c join chapter10.DVD d on c.MediaId = d.MediaId

end

2.右击模型设计视图,选择 “从数据库中更新模型”,选择存储过程GetAllMedia.点击“完成”

3. ( 译注:我的环境是win10+vs2013+ef6.1.3,是不需要这步的,第1步已经把这步也完成了,只是最后的“返回以下内容的集合”必须修改一下)右击模型的设计视图, 选择“新增“ ➤ 函数导入. 从“存储过程/函数名称”下拉框中选择GetAllMedia. 在“函数导入名称“文本框中输入:GetAllMedia. 这个就是在模型中的方法名称.在“返回以下内容的集合”里勾选“实体”,在下拉框里选择Media.单击“确定”.将会创建<FunctionImportMapping>框架.

4. 右击 .edmx 文件, 选择“打开方式” ➤ XML Editor.编辑.edmx文件的mapping 小节下

的<FunctionImportMapping> 标签,用 Listing 10-16所示代码去匹配(因为像EF6RecipesModel的命名与你的例子可能不同).它会映射被存储过程返回的列与Media类型的实体的属性。

Listing 10-16. This FunctionImportMapping Conditionally Maps the Returned Rows to Either the

Magazine or the DVD Entity.

<FunctionImportMapping FunctionImportName="GetAllMedia" FunctionName="EF6RecipesModel.Store.GetAllMedia">

<ResultMapping>

<EntityTypeMapping TypeName="EF6RecipesModel.Magazine">

<ScalarProperty ColumnName="PublicationDate" Name="PublicationDate"/>

<Condition ColumnName="MediaType" Value="Magazine"/>

</EntityTypeMapping>

<EntityTypeMapping TypeName="EF6RecipesModel.DVD">

<ScalarProperty ColumnName="PlayTime" Name="PlayTime"/>

<Condition ColumnName="MediaType" Value="DVD"/>

</EntityTypeMapping>

</ResultMapping>

</FunctionImportMapping>

5. 接下来用Listing 10-17所示的代码通过GetAllMedia()方法调用存储过程GetAllMedia

Listing 10-17. Using the GetAllMedia Stored Procedure via the GetAllMedia() Method

static void Main(string[] args)

{

using (var context = new EFRecipesEntities1006())

{

context.Media.Add(new Magazine

{

Title = "Field and Stream",

PublicationDate = DateTime.Parse("6/12/1945")

});

context.Media.Add(new Magazine

{

Title = "National Geographic",

PublicationDate = DateTime.Parse("7/15/1976")

});

context.Media.Add(new DVD

{

Title = "Harmony Road",

PlayTime = "2 hours, 30 minutes"

});

context.SaveChanges();

}

using (var context = new EFRecipesEntities1006())

{

var allMedia = context.GetAllMedia();

Console.WriteLine("All Media");

Console.WriteLine("=========");

foreach (var m in allMedia)

{

if (m is Magazine)

Console.WriteLine("{0} Published: {1}", m.Title,

((Magazine)m).PublicationDate.ToShortDateString());

else if (m is DVD)

Console.WriteLine("{0} Play Time: {1}", m.Title, ((DVD)m).PlayTime);

}

}

Console.WriteLine("\npress any key to exit...");

Console.ReadKey();

}

输出结果如下面的Listing 10-17:

===================================================================

All Media

=========

Field and Stream Published: 6/12/1945

National Geographic Published: 7/15/1976

Harmony Road Play Time: 2 hours, 30 minutes

===========================================

它是如何工作的?

该解决方案有两个关键点:鉴别列注入到结果集中和用条件映射结果实体.

===================================================================

■■注意:鉴别列是用来指定对象类型的数据库元数据列的记录.

========================================================================================

10-15所示的存储过程是把从 Magazine and取得的记录与从 DVD表取得的记录联合起来的表,然后把这个表注入到Magazine或DVD等媒体类型的鉴别列中.我们为每个select,我们都连接表示模型基类的 Media 表, 为了包含Title 列. 所有从这三个表来的记录,都包含在结果集中,并且含有具体从某个表来的标记.根据记录的标记(Magazine或DVD),我们把它们分别映射到Magazine 或DVD 实体. 这个操作在<FunctionImportMapping>节里完成,.

当我们添加函数导入时添加了调用GetAllMedia存储过程的方法GetAllMedia(),在Listing 10-17里,我们调用该方法.之后,整个对象图被继承结构完整地实例化。我们遍历这个对象集合,交替得打印出Magazine 和DVD 实体.

Entity Framework 6 Recipes 2nd Edition(10-6)译 - TPT继承模型中使用存储过程相关推荐

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

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

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

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

  3. Entity Framework 6 Recipes 2nd Edition(13-2)译 - 用实体键获取一个单独的实体

    问题 不管你用DBFirst,ModelFirst或是CodeFirst的方式,你想用实体键获取一个单独的实体.在本例中,我们用CodeFirst的方式. 解决方案 假设你有一个模型表示一个Paint ...

  4. Entity Framework 6 Recipes 2nd Edition(9-2)译-用WCF更新单独分离的实体

    9-2. 用WCF更新单独分离的实体 问题 你想通过WCF为一个数据存储发布查询,插入,删除和修改,并且使这些操作尽可能地简单 此外,你想通过Code First方式实现EF6的数据访问管理 解决方案 ...

  5. Entity Framework 6 Recipes 2nd Edition(13-6)译 - 自动编译的LINQ查询

    问题 你想为多次用到的查询提高性能,而且你不想添加额外的编码或配置. 解决方案 假设你有如Figure 13-8 所示的模型 Figure 13-8. A model with an Associat ...

  6. Entity Framework 6 Recipes 2nd Edition(12-1)译 - 当SaveChanges( ) 被调用时执行你的代码...

    第12章定制EF 在本章的小节里,定制实体对象和EF处理的一些功能.这些小节将涵盖很多"幕后"的事情,能让你的代码更加统一解决一些事情,比如用一个业务规则中心统一地为实体执行验证. ...

  7. Entity Framework 6 Recipes 2nd Edition(9-7)译-在WCF服务中序列化代理

    9-7. 在WCF服务中序列化代理 问题 从一个查询里返回一个动态代理对象,想要把它序列为一个POCO(Plain-Old CLR Objects)对象. 实现基于POCO实体对象, 在运行时,EF会 ...

  8. Entity Framework 6 Recipes 2nd Edition(10-5)译 - 在存储模型中使用自定义函数

    10-5. 在存储模型中使用自定义函数 问题 想在模型中使用自定义函数,而不是存储过程. 解决方案 假设我们数据库里有成员(members)和他们已经发送的信息(messages) 关系数据表,如Fi ...

  9. Entity Framework 6 Recipes 2nd Edition(10-3)译 - 返回结果是一个标量值

    10-3. 返回结果是一个标量值 问题 想取得存储过程返回的一个标量值. 解决方案 假设我们有如Figure 10-2所示的ATM机和ATM机取款记录的模型 Figure 10-2. 一个ATM机和A ...

最新文章

  1. Google Test(GTest)使用方法和源码解析——私有属性代码测试技术分析
  2. 新的Mac下如何配置开发者账号信息
  3. JavaScript -- throw、try 和 catch
  4. eclipse中在类saolei.Test 中找不到main方法
  5. java linkedlist源码分析_LinkedList源码分析(基于Java8)
  6. Win2003打不开https的问题
  7. AndroidManifest.xml 注意事项
  8. 推荐一些好用的Chrome插件
  9. redis key操作大全
  10. 多旅行商问题(Multiple Traveling Salesman Problem, MTSP):单仓库多旅行商问题及多仓库多旅行商问题(含动态视频)
  11. 拼插机器人课和围棋课_乐高机器人玩具与机器人教育有什么区别?
  12. 自恢复保险丝工作原理
  13. 性能测试基础培训 - PPT下载
  14. The artifact org.apache.commons:commons-io:jar:1.3.2 has been relocated to commons-io:commons-io:jar
  15. 学计算机专业好还是学医专业好,学计算机好还是学医好 程序员的建议就是学医你认为呢...
  16. 图解卷积前后图像尺寸的关系
  17. php启动后no input file specified.,no input file specified 三种解决方法
  18. 【51单片机学习笔记】基于STC11F04E的蜂鸣器音乐播放器
  19. Http 同步和异步的区别
  20. 5.1 傅里叶展开,傅里叶级数推导

热门文章

  1. java调用cd传输_Java调用Linux命令(cd的处理)
  2. java的知识点运用_Java--知识点运用
  3. vb计算机考试试题及答案,计算机二级考试《VB》操作试题及答案2016
  4. DFT的推导(记录与疑惑)
  5. java面试-深入理解JVM(一)——JVM内存模型
  6. Jmeter之分布式测试
  7. android控件跟随手势滑动改变位置
  8. 更改SQL 2005登录时的默认数据库
  9. 在WinForms中使用ActiveX
  10. NHibernate使用时,不能返回自己的异常的解决办法