《Entity Framework 6 Recipes》中文翻译——第十章EntityFramework存储过程处理(八)

将插入、更新和删除操作映射到存储过程

问题

  您想在存储过程中映射插入、更新和删除操作。

解决方案

  下图所示的运动员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);
                }
            }

执行结果

原文地址:https://www.cnblogs.com/yunxiaguo/p/5708082.html