《EntityFramework6Recipes》中文翻译系列(32)第六章继承与建模高级应用之TPH与TPT(1)chinafucan

你的表中,有一列允许为null。你想使用TPH创建一个模型,列值为null时,表示一个派生类型,不为null时,表示另一个派生类型。

解决方案

假设你有一张表,描述医学实验药物。这张表包含一列指示该药是什么时候批准生产的。药在批准生产之前都被认为是实验性的。一但批准生产,它就被认为是药物了。我们就以图6-7中Drug表开始我们这一小节的学习。

图6-7Drug表中有一列可为null鉴别列,AcceptedDate

按下面的步骤为Drug表建模:

1、创建一个派生至DbContext的上下文对象Recipe6Context;

2、创建POCO实体类Drug、Medicine和Experimental,如代码清单6-17所示;

代码清单6-17.创建POCO实体Drug、Medicine和Experimental

1[Table("Drug",Schema="Chapter6")]2publicabstractclassDrug3{4[Key]5[DatabaseGenerated(DatabaseGeneratedOption.Identity)]6publicintDrugId{get;set;}7publicstringName{get;set;}8}910publicclassExperimental:Drug11{12publicstringPrincipalResearcher{get;set;}1314publicvoidPromoteToMedicine(DateTimeacceptedDate,decimaltargetPrice,15stringmarketingName)16{17vardrug=newMedicine{DrugId=this.DrugId};18using(varcontext=newRecipe6Context())19{20context.Drugs.Attach(drug);21drug.AcceptedDate=acceptedDate;22drug.TargetPrice=targetPrice;23drug.Name=marketingName;24context.SaveChanges();25}26}2728}2930publicclassMedicine:Drug31{32publicdecimalTargetPrice{get;set;}33publicDateTimeAcceptedDate{get;set;}34}3、在上下文对象Recipe6Context中添加一个类型为DbSe的属性;

4、在上下文对象Recipe6Context中重写OnModelCreating方法,让它为临床用药(Medicine)和试验性药物(Experimental)类型配置TPH映射。如代码清单6-18所示;

代码清单6-18.重写OnModelCreating方法,使之配置TPH映射

1protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder)2{3base.OnModelCreating(modelBuilder);4modelBuilder.Entity()5.Map(m=>m.Requires("AcceptedDate").HasValue((DateTime)null));6modelBuilder.Entity()7.Map(m=>m.Requires(d=>d.AcceptedDate).HasValue());8}原理

在示例中,我们使用null和非null作为条件分别映射,不包含AcceptedDate的试验性药物(Experimental)和包含AcceptedDate的临床用药(Medicine)。和多数继承的例子一样,我们创建一个抽象的基类实体,之所以为抽象,是因为在我们的模型中,不会使用一个未分类的药物。

有趣的是,在Medicine实体中,我们将鉴别列映射到一个标题属性上。在绝大多数情况下,将鉴别列映射到一个标量属性是被禁止的。然而,在这个示例中,我们使用null和非null作为条件,不仅如此,AcceptedDate还设为不可空,这些对属性值的约束使得该属性可以被映射。

在代码清单6-19中,我们插入了两个试验性药物,并查询出插入的数据。我们使用AcceptedDate属性为我们提供的机会,可以将一个对象从一个派生类型改变为另一个派生类型。在我们的示例中,我们创建了两个试验性药物,随后将他们中的一个提升为临床用药。

代码清单6-19.插入并获取我们的派生类型实例

using(varcontext=newRecipe6Context()){varexDrug1=newExperimental{Name="Nanoxol",PrincipalResearcher="Dr.SusanJames"};varexDrug2=newExperimental{Name="Percosol",PrincipalResearcher="Dr.BillMinor"};context.Drugs.Add(exDrug1);context.Drugs.Add(exDrug2);context.SaveChanges();//Nanoxol刚获生产批准exDrug1.PromoteToMedicine(DateTime.Now,19.99M,"Treatall");context.Entry(exDrug1).State=EntityState.Detached;//不在使用此实例}using(varcontext=newRecipe6Context()){Console.WriteLine("ExperimentalDrugs");foreach(vardincontext.Drugs.OfType()){Console.WriteLine("\t{0}({1})",d.Name,d.PrincipalResearcher);}Console.WriteLine("Medicines");foreach(vardincontext.Drugs.OfType()){Console.WriteLine("\t{0}Retailsfor{1}",d.Name,d.TargetPrice.Value.ToString("C"));}}代码清单6-19的输出如下:

ExperimentalDrugsPercosol(Dr.BillMinor)MedicinesTreatallRetailsfor$19.99我们使用PromoteToMedicine()方法将一个试验性药物(Experimental)提升为临床用药(Medicine)。在这个方法的实现中,我们创建了一个Medicine实例,将它附加到一个新的上下文中,并使用适当的值初始化它。一旦这个新的实例被初始化和附加,我们就调用SaveChanges()方法将它保存到数据库中,因为这个实例有一个和试验性药物相同的键(DrugId),实体框架会产生一个update(更新)语句,而不是insert(插入)语句。

我们在POCO类Experimental中实现了这个方法。这让我们可以无缝地在这样的类中添加一个方法,通过这种方式,提供了一种更简洁的实现。话虽这么说,但我们感兴趣的是,创建一个透明持久化(persistence-ignorant)的POCO实体,能被用在多个上下文对象中,这让我们可以在helper类中实现一个稍微不同的版本。

在一个存在的架构中,你有一张或多张表,与一张共享表有一对一的关系,共享表中使用的键在表中不是主键,你想使用TPT对此建模。

假设你的数据库中包含的数据库关系图如图6-8所示。

图6-8一个包含staff,Principal和Instructor表的关系对象图

在图6-8中,我们一张职工(Staff)表,它包含员工的姓名(Name),两张包含校长(Principal)、教员(Instructor)信息的表。这里需要引起注意的是,表Principal和Instructor中的主键不是Staff表的外键。在这种类型的关系结构是不能直接使用TPT继承映射的。对于TPT,关联表的主键必须是主表(基表)的外键。同时,还要注意的是,关系是一对一。这是因为我们对Principal和Instructor表中StaffId列创建了唯一索引的约束。

按下面的步骤,为图6-8中的表及其关系建模:

1、在你的项目中添加一个ADO.NETEntityDataModel(ADO.NET实体数据模型),并导入表Staff,Principal,和Instructor;

2、删除实体Principal与Staff之间的关联,实体Instructor与Staff之间的关联;

3、右键Staff实体,选择Add(增加)Inheritance(继承)。选择Staff作为基类,Principal作为派生类。重复前面的操作,选择Staff作为基类,Instructor作为派生类型。

4、从实体Instructor和Principal中删除属性StaffId;

5、右键实体Staff,选择Properties(属性)。设置Abstract(抽象)属性为True。这会让实体Staff成为一个抽象类;

6、因为StaffId在表Principal和Instructor中不是主键,所以我们不能使用默认表映射来映射实体Principal和Instructor,或者Staff。依次选择每个表,并在映射详细信息窗口删除表映射。

7、使用代码清单6-20中的代码创建存储过程,我们会将这些存储过程映射到实体Principal和Instrucotr中的插入、更新和删除操作;

代码清单6-20.实体Instructor和Principal插入、更新和删除动作的存储过程

9、选择实体Principal,并查看MappingDetailswindow(映射详细信息窗口)。单击MapEntitytoFunction(映射实体到函数)按钮。这个按钮是在映射详细信息窗口左边最下边的一个按钮。映射Insert、Update和Delete动作到存储过程。确保映射插入动作的resultcolumns(结果列)StaffId和PrincipalId(如图6-9)。

图6-9为实体Principal映射Insert,Update和Delete动作

10、在上实体Instructor重复第9步。确保映射插入动作的resultcolumns(结果列)StaffId和PrincipalId。

在解决方案浏览器中右键.edmx文件,选择OpenWith(打开方式)XMLEditor(XML文本编辑器)。这将关闭设计器窗口并在XML编辑器中打开.edmx文件。滚动到映射怪中的标签。将代码清单6-21中的查询视图(QueryView)插入到标签中。

123selectvalue4case5when(i.StaffIdisnotnull)then6Apress.EF6Recipes.BeyondModelingBasics.Recipe7.Instructor(s.StaffId,s.Name,i.InstructorId,i.Salary)7when(p.StaffIdisnotnull)then8Apress.EF6Recipes.BeyondModelingBasics.Recipe7.Principal(s.StaffId,s.Name,p.PrincipalId,p.Salary,p.Bonus)9END10fromApressEF6RecipesBeyondModelingBasicsRecipe7StoreContainer.Staffass11leftjoinApressEF6RecipesBeyondModelingBasicsRecipe7StoreContainer.Instructorasi12ons.StaffId=i.StaffId13leftjoinApressEF6RecipesBeyondModelingBasicsRecipe7StoreContainer.Principalasp14ons.StaffId=p.StaffId1516原理

使用TPT继承映射,实体框架要求基类表中的外键是派生类中的主键。在我们的示例中,每个派生类表有自己独立的主键。

为了创建TPT继承映射模型,在概念层,实体Principal和Instructor继承自实体Staff。接下来,我们删除导入表时创建的映射。然后我们使用一个QueryView表达式来创建一个新的映射。使用QueryView将Insert、Update和Delete动作放入我们的代码中。为了处理这些动作,我们在数据库中创建了额外的存储过程。

我们使用QueryView将映射派生类中的标量属性到数据库表中。QueryView中的关键部分是case语句。这里有两种情况,我们有一个Principal和一个Instructor。如果Instructor的StaffId非null时,我们就得到一个Instructor实例;如果Principal的StaffId为null时,我们就得到一个Principal实例。表达式剩下的部分是,引入派生类表中的行。

代码清单6-22插入一位校长和一位教员到数据库表中。

代码清单6-22.从模型中插入和获取

1using(varcontext=newRecipe7Context())2{3varprincipal=newPrincipal4{5Name="RobbieSmith",6Bonus=3500M,7Salary=48000M8};9varinstructor=newInstructor10{11Name="JoanCarlson",12Salary=39000M13};14context.Staffs.Add(principal);15context.Staffs.Add(instructor);16context.SaveChanges();17}1819using(varcontext=newRecipe7Context())20{21Console.WriteLine("Principals");22Console.WriteLine("==========");23foreach(varpincontext.Staffs.OfType())24{25Console.WriteLine("\t{0},Salary:{1:C},Bonus:{2:C}",26p.Name,p.Salary,27p.Bonus);28}29Console.WriteLine("Instructors");30Console.WriteLine("===========");31foreach(variincontext.Staffs.OfType())32{33Console.WriteLine("\t{0},Salary:{1:C}",i.Name,i.Salary);34}35}代码清单6-22的输出如下:

Principals==========RobbieSmith,Salary:$48,000.00,Bonus:$3,500.00Instructors===========JoanCarlson,Salary:$39,000.00

THE END
1.recipe是什么意思recipe在线翻译英语读音用法例句recipe 常用词汇 英['res?pi]美['res?pi] n.秘诀;食谱;药方 Created with Highcharts 3.0.2释义常用度分布图海词统计 食谱 秘诀 药方 名词复数:recipes recipe的英文翻译是什么意思,词典释义与在线翻译: 详尽释义 n.(名词) 方法 秘诀 食谱 诀窍http://dict.cn/recipe
2.recipe是什么意思recipe怎么读中文意思用法recipe recipe是什么意思、recipe怎么读 读音:英['res?p?] 美['r?s?pi] recipe 基本解释 n. 食谱;处方;秘诀 recipe 网络释义 n. 食谱;[临床] 处方;秘诀 recipe 词性变化 名词复数形式:recipes 中文词源 recipe 食谱,秘诀 re-,向后,往回,-cip,抓住,词源同 receive,participate.引申词义食谱,秘诀https://danci.gjcha.com/recipe.html
3.英语词汇recipe怎么读,是什么意思,单词翻译读音固定搭配用法英汉双解词典包含38652条英汉词条,基本涵盖了全部常用单词的翻译及用法,是英语学习的有利工具。http://ec.newdu.com/28116.html
4.recipes是什么意思英语单词大全为您提供2024 最新英文单词recipes的解释,recipes相关词组,recipes是什么意思,recipes的用法,recipes的意思,recipes的例句,recipes的中文意思,recipes用法及例句等信息,希望对您的学习有所帮助!https://dancim.hao86.com/recipes/
5.Recipes是什麼意思Recipes的讀音解釋例句用法Recipes的意思,Recipes的英英解釋翻譯,Recipes的讀音,Recipes的近義詞,Recipes的反義詞,各種詞態下Recipes的名著例句及對應的免費txt電子書下載服務,部分單詞還提供類似周公解夢的非嚴肅性解釋。http://enmama.net/_a_cnt/132996.php
6.recipes是什么意思功能简介 根据单词,查询中文翻译、例句和语法等。 分享到 好工具要推荐给好朋友! 英汉词典 最新搜索: caffee ket rhizome gawd recipes bicolored recipes 英语音标 英式:[?res?p?z]美式:[?res?p?z] 英语翻译 配方 更多单词 上一条:lists 下一条:hooked关于http://www.zxxyy.cn/3-15768
7.recipes的翻译是:什么意思?中文翻译英文,英文翻译中文,怎么说当前位置:首页 ? 翻译 匿名 关注:1 2013-05-23 12:21 求翻译:recipes是什么意思?待解决 悬赏分:1 - 离问题结束还有 recipes问题补充:匿名 2013-05-23 12:21:38 食谱 匿名 2013-05-23 12:23:18 食谱; 处方; 烹饪法; 制作法 匿名 2013-05-23 12:24:58 食谱 匿名 2013-05-23 12:http://www.zaixian-fanyi.com/fan_yi_14764358
8.recipes是什么意思recipes的中文翻译例句用法中文翻译 n.烹饪法( recipe的名词复数 );食谱;方法;秘诀 词态变化 原级:recipe 词组短语 healthyrecipes健康食谱 swizzle drinkrecipes调酒秘方 holidayrecipes节日食谱 vegetarianrecipes素食食谱 numericalrecipes数值分析方法库 用法例句 1. Many of theserecipesare highly flavoured. https://danci.gei6.com/recipes__h3rs9joq.html
9.recipes的意思是什么recipes中文翻译recipes 历史记录 recipes 双语例句 更多例句 1、 recipesfor jams and preserves 果酱和蜜饯的制作方法 《牛津高阶英汉双解词典》 2、 We produce our own hair-care products, all based on herbalrecipes. 我们自己生产护发产品,全部采用草本配方. 柯林斯词典例句库https://dict.ruihongw.com/recipes
10.software是什么意思『欧路词典』为您提供numerical recipes software的用法讲解,告诉您准确全面的numerical recipes software的中文意思,numerical recipes software的读音,numerical recipes software的同义词,numerical recipes software的反义词,numerical recipes software的例句。http://dict.eudic.net/dicts/en/numerical%20recipes%20software
11."recipe"是什么意思"recipe"的中文翻译简明英语-中文词典 ˋr?s?pI,-?pi; ˊresipi< rec.i.pe >[次常用字]<<名词>>1 烹饪法, 食谱, 调制法 (for)2 方法, 秘诀, 秘法 (for) 与"recipe"相近的词条 recification recified alcohol recin recip recipavrin recipe recipe for stopping leukorrhagia recipe handed down from anchttp://www.mcd8.com/w/recipe
12.recipes是什么意思,recipes怎么读,recipes翻译为:烹饪法(reciprecipes recipes是什么意思,recipes怎么读语音: 英音['res?p?z] 美音['res?p?z] recipes 基本解释 n.烹饪法( recipe的名词复数 );食谱;方法;秘诀 中文词源 recipes 用法和例句提示:点击例句中的单词,就可以看到词义解释 It 's all there , including a chapter with some appetizing , heart-https://fy.tingclass.net/w/recipes
13."recipes"是什么意思"recipes"翻译recipes ['resipi] n. 食谱;[医]处方;秘诀 同义词 n. formula 参考例子 1.Do you have any good healthy recipes? 有谁知道什么好时髦饮食谱? 2.I hope these recipes will bring you good appetite and health. 希望本书能为大家带来好胃口及身体健康。 3.Most of these are ingredients which are http://mdict.kekenet.com/obedience?word=recipes
14.recipes是什么意思recipes的翻译记忆用法托福例句雅思威学在线词典,为您提供recipes的中文意思,recipes的用法讲解,recipes的读音,recipes的同义词,recipes的反义词,recipes的例句等英语服务。https://t.weixue100.com/word/recipes
15.recipesforjamsandpreserves是什么意思在线翻译recipes for jams and preserves的意思是:果酱和蜜饯的制作方法http://www.hanyucidian.cn/sentence/E153100.html
16.Bank是什么意思Bank在线中文翻译读音用法和例句Bank是什么意思 Bank在线中文翻译 bank英 [bk]美 [bk] 复数形式:banks 第三人称单数:banks 现在分词:banking 过去式:banked 过去分词:banked bank 词典解释 名词银行;(条形的)堆;(河的)岸;库存 及物/不及物动词堆积;筑(堤);将(钱)存入银行https://dict.xhlylx.com/Bank.html
17.cube是什么意思cube的中文翻译常见短语及例句(8页)cube是什么意思-cube的中文翻译-常见短语及例句.doc 关闭预览 想预览更多内容,点击免费在线预览全文 免费在线预览全文 精品文档可编辑 值得下载收藏 cube是什么意思-cube的中文翻译-常见短语及例句 你知道怎么解释cube这个单词吗?cube可以怎么造句呢?请阅读以下文章,跟着pincai小编一起来了解。cube是什么意思_cube的中文https://max.book118.com/html/2021/1211/8076016060004055.shtm
18.gypsy是什么意思G开头的英语单词gypsy 是什么意思 音标:[ 'd?ipsi ] 中文翻译与英英解释 n.1.〔常 G-〕吉普赛人; 〔G-〕 吉普赛语。2.像吉普赛人的人,黑脸妇女,顽皮[动人]的姑娘。3.【航海】绞绳筒,手推绞盘。adj.吉普赛式的流浪的。vi.过吉普赛式的生活过流浪生活,野餐旅行。n.-hood 吉普赛生涯;吉普赛人身分。n.-dom 吉普赛http://www.yingyucha.com/yingyudanci/g/gypsy.html
19.number是什么意思number的用法number的单词速记number怎么读number是什么意思|number的用法|number的单词速记|number怎么读|number的考法|number的中文释义|number的例句|number的音标|number的翻译和解释|怎教学设计2024-01-05 21:58:58贝语网校核心词义n. 数量;数字 速记技巧 词源记忆法 直接源自古法语的nombre;最初源自拉丁语的numerus,意为数字。 谐音记忆法 谐音:难吧,http://m.beiyuwangxiao.com/ZhongXueJiaoYu/yw1/jianan/137756.html
20.diaphoreticrecipes什么意思及同义词沪江词库精选diaphoretic recipes是什么意思、英语单词推荐、diaphoretic recipes的用法、diaphoretic recipes什么意思及同义词、翻译diaphoretic recipes是什么意思http://m.hujiang.com/ciku/diaphoretic_recipes/?source=pc
21.bank英语怎么读,翻译成中文是什么意思读/说/理解/用法单词bank英语怎么读,用英语怎么说,美式、英式音标读音;bank英语翻译成中文是什么意思;写典通,为您提供bank英语词典真人发音.https://yingyu.xiediantong.com/cidian/7dfa5941acb64d82/
22.bank是什么意思bank翻译读音用法翻译vipkid提供bank是什么意思、bank英语单词推荐、bank英语解释、bank相关词、bank英语短语 英音[bk] 美音 [bk] 【中文释义】 n. 银行;(条形的)堆;(河的)岸;库存; vt.& vi. 堆积;筑(堤);将(钱)存入银行; vi. (转弯时)倾斜飞行;(在某银行)开账户,存款; vt. (用煤等)封炉火; 【英https://mobile.vipkid.com.cn/posts/7557.html