欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Entity Framework使用Code First模式管理存儲(chǔ)過(guò)程

 更新時(shí)間:2022年03月05日 14:39:35   作者:.NET開(kāi)發(fā)菜鳥  
本文詳細(xì)講解了Entity Framework使用Code First模式管理存儲(chǔ)過(guò)程的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

在EF中使用存儲(chǔ)過(guò)程和使用視圖是很相似的,一般會(huì)使用Database對(duì)象上的兩個(gè)方法:SqlQuery和ExecuteSqlCommand。為了從存儲(chǔ)過(guò)程中讀取很多數(shù)據(jù)行,我們只需要定義一個(gè)類,我們會(huì)將檢索到的所有數(shù)據(jù)行物質(zhì)化到該類實(shí)例的集合中。比如,從下面的存儲(chǔ)過(guò)程讀取數(shù)據(jù):

CREATE PROCEDURE [dbo].[SelectBooks]
@BookTypeName AS NVARCHAR(10)
AS
BEGIN
select B.Name,B.Author,B.PublicationDate,T.BookTypeName from Books as B
join BookTypes as T on B.BookTypeId=T.BookTypeId where T.BookTypeName=@BookTypeName
END

1、定義實(shí)體類

Book實(shí)體類定義如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeFirstProcedureApp.Model
{
    public class Book
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public string Author { get; set; }

        public DateTime PublicationDate { get; set; }

        public virtual BookType BookType { get; set; }
    }
}

BookType實(shí)體類定義如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeFirstProcedureApp.Model
{
    public class BookType
    {
        public BookType()
        {
            Books = new HashSet<Book>();
        }

        public int BookTypeId { get; set; }

        public string BookTypeName { get; set; }

        public virtual ICollection<Book> Books { get; set; }
    }
}

2、定義與存儲(chǔ)過(guò)程結(jié)果匹配的實(shí)體類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeFirstProcedureApp.Model
{
    public class BookFromProcedure
    {
        public string Name { get; set; }

        public string Author { get; set; }

        public DateTime PublicationDate { get; set; }

        public string BookTypeName { get; set; }
    }
}

注意:類的屬性名必須和存儲(chǔ)過(guò)程中定義的列名一致。

3、創(chuàng)建種子初始化器類

using CodeFirstProcedureApp.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeFirstProcedureApp.EF
{
    public class Initializer : DropCreateDatabaseIfModelChanges<EFDbContext>
    {
        protected override void Seed(EFDbContext context)
        {
            // 創(chuàng)建初始化數(shù)據(jù)
            BookType bookType = new BookType()
            {
                BookTypeName = "文學(xué)小說(shuō)",
                Books = new List<Book>
                {
                  new Book(){Name="人間失格",Author="太宰治",PublicationDate=DateTime.Parse("2015-08-01")},
                  new Book(){Name="解憂雜貨店",Author="東野圭吾",PublicationDate=DateTime.Parse("2014-05-01")},
                  new Book(){Name="追風(fēng)箏的人",Author="卡勒德胡賽尼",PublicationDate=DateTime.Parse("2006-08-01")},
                  new Book(){Name="百年孤獨(dú)",Author="加西亞馬爾克斯",PublicationDate=DateTime.Parse("2011-06-01")},
                  new Book(){Name="霍亂時(shí)期的愛(ài)情",Author="加西亞馬爾克斯",PublicationDate=DateTime.Parse("2015-06-01")}
                }
            };

            BookType bookType2 = new BookType()
            {
                BookTypeName = "科學(xué)",
                Books = new List<Book>
                {
                   new Book(){Name="人類簡(jiǎn)史",Author="尤瓦爾赫拉利",PublicationDate=DateTime.Parse("2017-01-01")}
                }
            };

            context.BookTypes.Add(bookType);
            context.BookTypes.Add(bookType2);
            base.Seed(context);
        }
    }
}

4、定義數(shù)據(jù)上下文類

using CodeFirstProcedureApp.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeFirstProcedureApp.EF
{
    public class EFDbContext :DbContext
    {
        public EFDbContext()
            : base("name=AppConnection")
        {
            Database.SetInitializer(new Initializer());
        }

        // 添加到數(shù)據(jù)上下文中
        public DbSet<Book> Books { get; set; }

        public DbSet<BookType> BookTypes { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            // 配置表名和主鍵
            modelBuilder.Entity<Book>().ToTable("Books").HasKey(p => p.Id);
            modelBuilder.Entity<BookType>().ToTable("BookTypes").HasKey(p => p.BookTypeId);
            // 設(shè)置實(shí)體關(guān)系
            //  BookType和 Books 一對(duì)多關(guān)系 外鍵:BookTypeId
            modelBuilder.Entity<BookType>().HasMany(p => p.Books).WithRequired(t => t.BookType)
                .Map(m =>
                {
                    m.MapKey("BookTypeId");
                });
            base.OnModelCreating(modelBuilder);
        }
    }
}

5、運(yùn)行程序

使用SQL語(yǔ)句創(chuàng)建存儲(chǔ)過(guò)程:

var createSql = @"CREATE PROCEDURE [dbo].[SelectBooks]
                                    @BookTypeName AS NVARCHAR(10)
                                    AS
                                    BEGIN
                                    select B.Name,B.Author,B.PublicationDate,T.BookTypeName from Books as B
                                    join BookTypes as T on B.BookTypeId=T.BookTypeId where T.BookTypeName=@BookTypeName
                                    END";
context.Database.ExecuteSqlCommand(createSql);

查看數(shù)據(jù)庫(kù):

調(diào)用存儲(chǔ)過(guò)程查詢數(shù)據(jù)

注意:在使用存儲(chǔ)過(guò)程前,先要在存儲(chǔ)過(guò)程中執(zhí)行該存儲(chǔ)過(guò)程或者使用上面的程序生成存儲(chǔ)過(guò)程。

var sql = "SelectBooks {0}";
var books = context.Database.SqlQuery<BookFromProcedure>(sql, "文學(xué)小說(shuō)");
books.ToList().ForEach(p =>
{
      Console.WriteLine("BookName:" + p.Name + "     Author:" + p.Author + "    BookTypeName:" + p.BookTypeName + "     PublicationDate:" + p.PublicationDate);
});

在上面的代碼中,我們制定了使用哪個(gè)類讀取查詢的結(jié)果,創(chuàng)建SQL語(yǔ)句時(shí),也為存儲(chǔ)過(guò)程的參數(shù)提供了一個(gè)格式化占位符,調(diào)用SqlQuery時(shí)為那個(gè)參數(shù)提供了一個(gè)值。假如要提供多個(gè)參數(shù)的話,多個(gè)格式化占位符必須要用逗號(hào)分隔,還要給SqlQuery提供值的數(shù)組。我們也可以使用表值函數(shù)代替存儲(chǔ)過(guò)程。存儲(chǔ)過(guò)程執(zhí)行結(jié)果如下:

6、執(zhí)行無(wú)返回值的存儲(chǔ)過(guò)程

另一個(gè)用例就是假如存儲(chǔ)過(guò)程沒(méi)有任何的返回值,只是對(duì)數(shù)據(jù)庫(kù)中的一張表或者多張表執(zhí)行了一條命令的情況。一個(gè)存儲(chǔ)過(guò)程做了多少事情不重要,重要的是它不返回任何數(shù)據(jù)。例如:下面的存儲(chǔ)過(guò)程只是更新了一些數(shù)據(jù):

CREATE PROCEDURE UpdateBooks
@name AS NVARCHAR(60),
@id as int
AS 
BEGIN
UPDATE Books SET Name=@name
WHERE Id=@id
END

 先在數(shù)據(jù)庫(kù)中執(zhí)行該存儲(chǔ)過(guò)程,然后要調(diào)用該存儲(chǔ)過(guò)程,我們使用ExecuteSqlCommand()方法。該方法會(huì)返回存儲(chǔ)過(guò)程或者其它任何SQL語(yǔ)句受影響的行數(shù)。如果對(duì)這個(gè)返回值不感興趣,可以忽略返回值。

var sql = "UpdateBooks @name,@id";
SqlParameter[] para = new SqlParameter[]
{
       new SqlParameter("@id",1d),
       new SqlParameter("@name","人間失敗"),
};
var book = context.Books.Where(p => p.Id == 1);
Console.WriteLine("執(zhí)行存儲(chǔ)過(guò)程前的數(shù)據(jù)為:");
foreach (var item in book)
{
       Console.WriteLine(item.Name + "\t" + item.Author + "\t" + item.PublicationDate);
}
var rowsAffected = context.Database.ExecuteSqlCommand(sql, para);
Console.WriteLine("影響的行數(shù)為{0}條", rowsAffected);
Console.WriteLine("執(zhí)行存儲(chǔ)過(guò)程之后的數(shù)據(jù)為:");
var books = context.Books.Where(p => p.Id == 1);
foreach (var item in books)
{
        Console.WriteLine(item.Name + "\t" + item.Author + "\t" + item.PublicationDate);
}

上面的代碼中為存儲(chǔ)過(guò)程提供了兩個(gè)參數(shù):一個(gè)是Name,一個(gè)是Id。這里需要注意的是:我們必須嚴(yán)格按照它們?cè)诖鎯?chǔ)過(guò)程中定義的順序依次傳入相應(yīng)的值,它們會(huì)以參數(shù)數(shù)組傳入ExecuteSqlCommand。執(zhí)行結(jié)果如下:

很大程度上,EF降低了存儲(chǔ)過(guò)程的需要。然而,仍舊有很多原因要使用它們。這些原因包括安全標(biāo)準(zhǔn)、遺留數(shù)據(jù)庫(kù)或者效率問(wèn)題。比如,如果需要在單個(gè)操作中更新幾千條數(shù)據(jù),然后在通過(guò)EF檢索出來(lái);如果每次都更新一行,然后在保存那些實(shí)例,效率是很低的。最后,即使使用了SqlQuery()方法調(diào)用了存儲(chǔ)過(guò)程,也可以更新數(shù)據(jù)。

注意:開(kāi)發(fā)者可以執(zhí)行任意的SQL語(yǔ)句,只需要將上面SqlQuery或ExecuteSqlCommand方法中的存儲(chǔ)過(guò)程名稱改為要執(zhí)行的SQL語(yǔ)句就可以了。 

示例代碼下載地址:點(diǎn)此下載

到此這篇關(guān)于Entity Framework使用Code First模式管理存儲(chǔ)過(guò)程的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • .Net下的簽名與混淆圖文分析

    .Net下的簽名與混淆圖文分析

    任何時(shí)候,軟件安全與版權(quán)保護(hù)都是很重要的,特別是企業(yè)級(jí)開(kāi)發(fā)或一些特殊應(yīng)用方面。對(duì).NET平臺(tái)下的開(kāi)發(fā)如何做到安全,本文主要討論簽名與混淆和原理與思路。
    2009-02-02
  • DataGridView自動(dòng)調(diào)整行高和行寬

    DataGridView自動(dòng)調(diào)整行高和行寬

    根據(jù)數(shù)據(jù)內(nèi)容自動(dòng)調(diào)整列寬,根據(jù)數(shù)據(jù)內(nèi)容自動(dòng)調(diào)整行高
    2009-04-04
  • asp.net core 系列之并發(fā)沖突的深入理解

    asp.net core 系列之并發(fā)沖突的深入理解

    這篇文章主要介紹了asp.net core 系列之并發(fā)沖突的深入理解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • ASP.NET配置KindEditor文本編輯器圖文教程

    ASP.NET配置KindEditor文本編輯器圖文教程

    這篇文章主要為大家分享了ASP.NET配置KindEditor文本編輯器圖文教程,很實(shí)用的學(xué)習(xí)教程,感興趣的小伙伴們可以參考一下
    2016-05-05
  • ASP.NET2.0:頁(yè)面中鏈入的CSS、js文件帶中文時(shí)需注意

    ASP.NET2.0:頁(yè)面中鏈入的CSS、js文件帶中文時(shí)需注意

    ASP.NET2.0:頁(yè)面中鏈入的CSS、js文件帶中文時(shí)需注意...
    2006-09-09
  • SQL Server 2008 R2:error 26 開(kāi)啟遠(yuǎn)程連接詳解

    SQL Server 2008 R2:error 26 開(kāi)啟遠(yuǎn)程連接詳解

    本篇文章小編為大家介紹,SQL Server 2008 R2:error 26 開(kāi)啟遠(yuǎn)程連接詳解。需要的朋友參考下
    2013-04-04
  • ASP.NET MVC Webuploader實(shí)現(xiàn)上傳功能

    ASP.NET MVC Webuploader實(shí)現(xiàn)上傳功能

    這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC Webuploader實(shí)現(xiàn)上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • .Net反向代理組件Yarp用法詳解

    .Net反向代理組件Yarp用法詳解

    本文詳細(xì)講解了.Net反向代理組件Yarp的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • .NET6+Quartz實(shí)現(xiàn)定時(shí)任務(wù)的示例詳解

    .NET6+Quartz實(shí)現(xiàn)定時(shí)任務(wù)的示例詳解

    在實(shí)際工作中,經(jīng)常會(huì)有一些需要定時(shí)操作的業(yè)務(wù),如:定時(shí)發(fā)郵件,定時(shí)統(tǒng)計(jì)信息等,那么如何實(shí)現(xiàn)才能使得我們的項(xiàng)目整齊劃一呢?本文通過(guò)一些簡(jiǎn)單的小例子,簡(jiǎn)述在.Net6+Quartz實(shí)現(xiàn)定時(shí)任務(wù)的一些基本操作,如有不足之處,還請(qǐng)指正
    2023-03-03
  • Asp.net Core 3.1基于AspectCore實(shí)現(xiàn)AOP實(shí)現(xiàn)事務(wù)、緩存攔截器功能

    Asp.net Core 3.1基于AspectCore實(shí)現(xiàn)AOP實(shí)現(xiàn)事務(wù)、緩存攔截器功能

    這篇文章主要介紹了Asp.net Core 3.1基于AspectCore實(shí)現(xiàn)AOP實(shí)現(xiàn)事務(wù)、緩存攔截器功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論