首页 技术 正文
技术 2022年11月18日
0 收藏 595 点赞 4,675 浏览 3097 个字

10-5. 在存储模型中使用自定义函数

问题

想在模型中使用自定义函数,而不是存储过程.

解决方案

假设我们数据库里有成员(members)和他们已经发送的信息(messages) 关系数据表,如Figure 10-4 所示:

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

Figure 10-4. A simple database of members and their messages

可能有这种情况,我们不允许入门级的程序员在数据库中创建存储过程,然而,又想封装members和他们发送的messages条数最多的业务逻辑,这个时候我们可以在模型中使用自定义函数。

我们的模型就如Figure 10-5所示:

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

Figure 10-5. The model for members and their messages

接下来在模型中定义函数To define the custom function in the storage model, do the following:

1.右击.edmx 文件,选择“打开方式” ➤ XML (文本)编辑器. 这样就会把.edmx 文件肜XML编辑器的方式打开.把 Listing 10-13里的代码添加到<Schema> 元素里(译注:你可能会发现有两个这样的元素,放在<edmx:StorageModels>里的那个就可以). 这个就是函数的定义.

Listing 10-13. The Definition of the Custom Function MembersWithTheMostMessages

<Function Name=”MembersWithTheMostMessages” IsComposable=”false”>

<CommandText>

select m.*

from chapter10.member m

join

(

select msg.MemberId, count(msg.MessageId) as MessageCount

from chapter10.message msg where datesent = @datesent

group by msg.MemberId

) temp on m.MemberId = temp.MemberId

order by temp.MessageCount desc

</CommandText>

<Parameter Name=”datesent” Type=”datetime” />

</Function>

2. 打开.edmx 文件的设计视图.右击设计视图,选择“新增” ➤ 函数导入.在对话框的“存储过程/函数名称”下选择MembersWithTheMostMessages,在“函数导入名称”方框框里输入MembersWithTheMostMessages., 在“返回以下内容的集合”里选择“实体”,在后面下拉框中选择Member. 单击“确定”.

3. 接下来在Listing 10-14 代码里通过使用 MembersWithTheMostMessages() 方法,来调用自定义函数MembersWithTheMostMessages

Listing 10-14. 通过MembersWithTheMostMessages()调用自定义函数MembersWithTheMostMessages

class Program

{

static void Main(string[] args)

{

DateTime today = DateTime.Parse(“5/7/2013”);

using (var context = new EFRecipesEntities1005())

{

var mem1 = new Member { Name = “Jill Robertson” };

var mem2 = new Member { Name = “Steven Rhodes” };

mem1.Messages.Add(new Message

{

DateSent = today,

MessageBody = “Hello Jim”,

Subject = “Hello”

});

mem1.Messages.Add(new Message

{

DateSent = today,

MessageBody = “Wonderful weather!”,

Subject = “Weather”

});

mem1.Messages.Add(new Message

{

DateSent = today,

MessageBody = “Meet me for lunch”,

Subject = “Lunch plans”

});

mem2.Messages.Add(new Message

{

DateSent = today,

MessageBody = “Going to class today?”,

Subject = “What’s up?”

});

context.Members.Add(mem1);

context.Members.Add(mem2);

context.SaveChanges();

}

using (var context = new EFRecipesEntities1005())

{

Console.WriteLine(“Members by message count for {0}”,

today.ToShortDateString());

var members = context.MembersWithTheMostMessages(today);

foreach (var member in members)

{

Console.WriteLine(“Member: {0}”, member.Name);

}

}

Console.WriteLine(“\nPress any key to exit…”);

Console.ReadKey();

}

}

如下Listing 10-14所示是输出结果:

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

Members by message count for 5/7/2013

Member: Jill Robertson

Member: Steven Rhodes

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

它是如何工作的?

一个自定义函数不同于模型定义的函数(见 Chapter 11) ,因为自定义函数是定义在存储模型中。这样使自定义函数就像传统的自义在数据库中的存储过程。如果说存储过程好比是在存储模型中定义一个“虚拟”的表,那么自定义函数就像是定义在存储模型中的一个“虚拟”的存储过程。

一些EF团队把它称为“自然函数”然后微软的团队用“自定义函数”,所以我们也用这个名称。

Listing 10-13里的代码定义我们的自定义函数.我们用XML编辑器把它放到.edmx文件存储模型节点(<edmx:StorageModels>)里。

注意:如果你用“从数据库更新模型”向导来更新模型,那么该向导会重写这个节点。所以在用向导前,请小心保存你在存储模型里所做的修改。

就像之前小节里使用存储过程一样,我们用“函数导入”向导来映射用户自定义函数到一个方法里。它设定了方法名,返回类型。在本例中,自定义函数返回Member实体集。

Listing 10-14里的代码,展示了用MembersWithTheMostMessages() 方法来调用自定义函数.这个方式与我们调用存储过程是一样的。

自定义函数适用于以下几种情况:

l  你没有创建存储过程的权限

l  你想把数据库和代码分开来管理.你可以使用自定义函数,而不用在数据库创建存储过程

l   当数据库中的存储过程的参数与你的实体不兼容时,你可以使用自定义函数,使用一个抽象层来来处理存储过程参数与你实体属性之间的类型转换。

附:创建示例用到的数据库的脚本文件

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,991
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,505
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,349
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,134
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,766
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,844