zoukankan      html  css  js  c++  java
  • 《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);
                    }
                }

    执行结果

  • 相关阅读:
    PAIRING WORKFLOW MANAGER 1.0 WITH SHAREPOINT 2013
    Education resources from Microsoft
    upgrade to sql server 2012
    ULSViewer sharepoint 2013 log viewer
    Top 10 Most Valuable Microsoft SharePoint 2010 Books
    讨论 Setsockopt选项
    使用 Alchemy 技术编译 C 语言程序为 Flex 可调用的 SWC
    Nagle's algorithm
    Nagle算法 TCP_NODELAY和TCP_CORK
    Design issues Sending small data segments over TCP with Winsock
  • 原文地址:https://www.cnblogs.com/yunxiaguo/p/5708082.html
Copyright © 2011-2022 走看看