将插入、更新和删除操作映射到存储过程
问题
您想在存储过程中映射插入、更新和删除操作。
解决方案
下图所示的运动员Athlete实体模型。底层数据库有一张运动员Athlete表。您想使用存储过程进行实体的插入、更新和删除操作。
要将存储的程序映射到“插入”、“更新”和“删除”操作中的“运动员”Athlete实体,做以下操作:
1、在数据库中创建一下存储过程
create procedure InsertAthlete (@Name varchar(50), @Height int, @Weight int) as begin insert into Athlete values (@Name, @Height, @Weight) select SCOPE_IDENTITY() as AthleteId end go create procedure UpdateAthlete (@AthleteId int, @Name varchar(50), @Height int, @Weight int) as begin update Athlete set Name = @Name, Height = @Height, [Weight] = @Weight where AthleteId = @AthleteId end go create procedure DeleteAthlete (@AthleteId int) as begin delete from Athlete where AthleteId = @AthleteId end
2、右键单击设计面并从数据库中选择更新模型。选择新的存储过程,然后单击完成。这将将存储的程序添加到模型中。
3、右键单击Athlete实体,并选择“存储过程映射”。为每个操作选择存储的程序。对于插入操作,映射返回列AthleteId,
我们用我们在数据库中创建的存储过程来更新模型。这使得在模型中存储过程得以验证。一旦我们有了在模型中可用的存储过程,我们将它们映射到实体的插入、更新和删除操作中。在这个解决方案中,存储过程是简单的,因为你可以得到返回的实体键值。对于插入存储过程,我们需要返回实体的存储生成的键值。在这个解决方案中,存储生成的键值只是一个标识列。我们需要将此从存储过程返回插入操作,并将此返回值映射到运动员Vthlate的VthlateId属性。这是一个重要的一步。如果没有这个,实体框架将无法得到刚刚插入的实例运动员实体实体键。你可能会问:“我什么时候存储过程映射到操作?”在大多数情况下,实体框架将为插入、更新和删除操作生成有效的代码。您可能也会想:“我什么时候需要更换这个用我自己的存储程序?“这里是最好的练习回答这个问题。
•您的公司要求您使用存储过程为某些或所有的插入、更新或删除某些表的活动。
•在一个或多个操作期间,您有额外的任务要做。例如,您可能希望管理一个审计跟踪或执行一些复杂的业务逻辑,或者您需要利用用户的权限来执行安全检查的存储过程。
•您的实体基于查询视图(见第6章和第15章),这要求您将一些操作映射到存储过程中的某些操作。
4、执行存储过程操作
using (var context = new School5Entities()) { context.Athletes.Add(new Athlete { Name = "Nancy Steward", Height = 167, Weight = 53 }); context.Athletes.Add(new Athlete { Name = "Rob Achers", Height = 170, Weight = 77 }); context.Athletes.Add(new Athlete { Name = "Chuck Sanders", Height = 171, Weight = 82 }); context.Athletes.Add(new Athlete { Name = "Nancy Rodgers", Height = 166, Weight = 59 }); context.SaveChanges(); } using (var context = new School5Entities()) { // do a delete and an update var all = context.Athletes; context.DeleteAthlete(all.First(o => o.Name == "Nancy Steward").AthleteId); all.First(o => o.Name == "Rob Achers").Weight = 80; context.SaveChanges(); } using (var context = new School5Entities()) { Console.WriteLine("All Athletes"); Console.WriteLine("============"); foreach (var athlete in context.Athletes) { Console.WriteLine("{0} weighs {1} Kg and is {2} cm in height", athlete.Name, athlete.Weight, athlete.Height); } }
执行结果