• 《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);
                    }
                }

    执行结果

  • 相关阅读:
    JSTL 配置
    HTML5 移动端web
    PHP 和 AJAX MySQL
    js php 互调
    google F12
    Codechef TRIPS Children Trips (分块、倍增)
    BZOJ 1859 Luogu P2589 [ZJOI2006]碗的叠放 (计算几何)
    AtCoder AGC002E Candy Piles (博弈论)
    BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)
    AtCoder AGC001F Wide Swap (线段树、拓扑排序)
  • 原文地址:https://www.cnblogs.com/yunxiaguo/p/5708082.html
Copyright © 2020-2023  润新知